これが私のアプリケーション構造です:
- app.js
- routes
---- index.js
ExpressJS
アプリは、development
およびproduction
環境のエラーハンドラーを作成します。 app.js
のコードスニペットは次のとおりです。
app.use('/', routes); // routing is handled by index.js in the routes folder
//The following middleware are generated when you create the Express App
// catch 404 and forward to error handler
app.use(function (req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function (err, req, res, next) {
res.status(err.status || 500);
res.render('error.ejs', {
message: err.message,
error: err
});
});
}
// production error handler
// no stacktraces leaked to user
app.use(function (err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});
そして、routes/index.js
の内部では、すべてのルーティングを処理します。
var router = express.Router();
router.get('/', function (req, res) {
someAsyncFunction(function(err, result) {
if (err) throw err; // Handle this error
}
});
module.exports = router;
err
をスローするのではなく、エラーハンドラーの1つに渡す必要があります。これどうやってするの?
通常はルートハンドラーの3番目のパラメーターである次のコールバックに渡す必要があります
_var router = express.Router();
router.get('/', function (req, res, next) {
someAsyncFunction(function(err, result) {
if (err) {
next(err); // Handle this error
}
}
});
module.exports = router;
_
next(err)
を呼び出すと、次のシグネチャを持つチェーンのミドルウェアでエラーをキャッチできます。
_app.use(function (err, req, res, next){
// do something about the err
});
_
必要に応じて矢印関数を使用して、コードをどこにでもコピーすることなく、すべてのルートでエラーを処理するミドルウェア関数を作成することもできます。
1)エラーを処理するconst関数を作成します。
どちらか:
const handleErrorAsync = func => (req, res, next) => {
func(req, res, next).catch((error) => next(error));
};
または
const handleErrorAsync = func => async (req, res, next) => {
try {
await func(req, res, next);
} catch (error) {
next(error);
}
};
2)ルーターでは、すべてのリクエストに使用します。
var router = express.Router();
router.get('/req1', handleErrorAsync(async (req, res, next) => {
let result = await someAsyncFunction1();
if(result){
// res.send whatever
}
}));
router.post('/req2', handleErrorAsync(async (req, res, next) => {
let result = await someAsyncFunction2(req.body.param1);
if(result){
// res.send whatever
}
}));
router.post('/req3', handleErrorAsync(async (req, res, next) => {
let result = await someAsyncFunction3(req.body.param1, req.body.param2);
if(result){
// res.send whatever
}
}));
module.exports = router;
3)サーバーのメインアプリでエラーを処理します:
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function (err, req, res, next) {
res.status(err.status || 500);
res.render('error.ejs', {
message: err.message,
error: err
});
});
}
// production error handler
// no stacktraces leaked to user
app.use(function (err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});
このようにして、エラー処理機能を任意のルートで再利用できます。また、関数のいずれかに未処理のエラーがある場合は、それらもキャッチします。
Here から取得したキャッチエラー処理を試してください