Sat*_*ato 6 javascript node.js express
在app.js中,我有
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
Run Code Online (Sandbox Code Playgroud)
所以如果我请求一些不存在的url http://localhost/notfound,上面的代码就会执行.
在存在url之类的http://localhost/posts/:postId,我想在访问一些不存在postId或删除postId时抛出404错误.
Posts.findOne({_id: req.params.id, deleted: false}).exec()
.then(function(post) {
if(!post) {
// How to throw a 404 error, so code can jump to above 404 catch?
}
Run Code Online (Sandbox Code Playgroud)
在 Express 中,404 不被归类为“错误”,可以这么说- 这背后的原因是 404 通常不是出现问题的迹象,只是服务器找不到任何东西。最好的办法是在路由处理程序中明确发送 404:
Posts.findOne({_id: req.params.id, deleted: false}).exec()
.then(function(post) {
if(!post) {
res.status(404).send("Not found.");
}
Run Code Online (Sandbox Code Playgroud)
或者,如果这感觉像是太多重复的代码,您可以随时将该代码提取到一个函数中:
function notFound(res) {
res.status(404).send("Not found.");
}
Posts.findOne({_id: req.params.id, deleted: false}).exec()
.then(function(post) {
if(!post) {
notFound(res);
}
Run Code Online (Sandbox Code Playgroud)
我不建议在这种情况下仅使用中间件,因为我觉得它使代码不太清晰 - 404 是数据库代码未找到任何内容的直接结果,因此在路由处理程序中进行响应是有意义的。
我有相同的 app.js 结构,我在路由处理程序中以这种方式解决了这个问题:
router.get('/something/:postId', function(req, res, next){
// ...
if (!post){
next();
return;
}
res.send('Post exists!'); // display post somehow
});
Run Code Online (Sandbox Code Playgroud)
该next()函数将调用下一个中间件,即 error404 处理程序(如果它位于 app.js 中的路由之后)。
| 归档时间: |
|
| 查看次数: |
7586 次 |
| 最近记录: |