Node.jsに次のコントローラー/ルート定義があります(ExpressとMongooseを使用)。ユーザーが存在しないページをリクエストしたときにエラーを処理する最も適切な方法は何ですか?
app.get('/page/:pagetitle', function(req, res) {
Page.findOne({ title: req.params.pagetitle}, function(error, page) {
res.render('pages/page_show.ejs',
{ locals: {
title: 'ClrTouch | ' + page.title,
page:page
}
});
});
});
それは現在私のアプリを壊します。私はエラーで何もしていないので、成功のようにビューにそれを渡していますか?
TypeError: Cannot read property 'title' of null
どうもありがとう。
エクスプレス error-pages の例を確認してください。原則として、最初にアプリのルートを登録してから、ルートにマッピングされていない他のすべてのリクエストのcatch all 404ハンドラーを登録します。最後に、次のように500ハンドラーが登録されます。
// "app.router" positions our routes
// specifically above the middleware
// assigned below
app.use(app.router);
// Since this is the last non-error-handling
// middleware use()d, we assume 404, as nothing else
// responded.
app.use(function(req, res, next){
// the status option, or res.statusCode = 404
// are equivalent, however with the option we
// get the "status" local available as well
res.render('404', { status: 404, url: req.url });
});
// error-handling middleware, take the same form
// as regular middleware, however they require an
// arity of 4, aka the signature (err, req, res, next).
// when connect has an error, it will invoke ONLY error-handling
// middleware.
// If we were to next() here any remaining non-error-handling
// middleware would then be executed, or if we next(err) to
// continue passing the error, only error-handling middleware
// would remain being executed, however here
// we simply respond with an error page.
app.use(function(err, req, res, next){
// we may use properties of the error object
// here and next(err) appropriately, or if
// we possibly recovered from the error, simply next().
res.render('500', {
status: err.status || 500
, error: err
});
});
Node.JSの主な問題の1つは、明確なエラーをキャッチできないことです。従来の方法は通常、すべてのコールバック関数に対するものであり、エラーがある場合、最初の引数はnullではありません。たとえば、次のようになります。
function( error, page ){
if( error != null ){
showErrorPage( error, req, res );
return;
}
...Page exists...
}
コールバックが多すぎると物事が醜くなります。 async のようなものを使用することをお勧めします。これにより、1つのエラーがある場合、エラーコールバックに直接移動します。
編集: エクスプレスエラー処理 を使用することもできます。