如何在express.js中抛出404错误?

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)

Joe*_*lay 7

在 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 是数据库代码未找到任何内容的直接结果,因此在路由处理程序中进行响应是有意义的。


Her*_*usz 5

我有相同的 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 中的路由之后)。