Node.js / Express – 找不到页面时呈现错误

我在Node.js中有以下控制器/路由定义(使用Express和Mongoose)。 当用户请求一个不存在的页面时,处理Error的最合适的方法是什么?

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 

非常感谢。

查看快速错误页面示例。 原则是首先注册您的应用程序路线,然后注册一个捕获所有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的一个主要问题是没有干净的错误捕获。 传统的方法通常是每个callback函数,如果有错误,第一个参数是非空,例如:

 function( error, page ){ if( error != null ){ showErrorPage( error, req, res ); return; } ...Page exists... } 

过了一段时间后,事情会变得越来越丑陋,我build议使用类似async的东西,这样如果有一个错误,它会直接导致错误callback。

编辑:您也可以使用快速error handling 。