【问题标题】:How add middleware for 404 errors on express如何在 express 上为 404 错误添加中间件
【发布时间】:2020-07-05 12:21:35
【问题描述】:

设置

app.use("/api/tobaccos", tobaccos);

app.use(function(err, req, res, next) {
  console.error(err.message);
});

api:

router.get("/:id", async (req, res) => {
  console.log("GET TOBACCO:" + req.params.id);

  await Tobacco.findById(req.params.id)
    .then(tobacco => res.status(200).json({ status: "success", data: tobacco }))
    .catch(error => res.status(404).json({
      status: "fail",
      msg: "Tobacco not found!",
      code: "error.tobaccoNotFound"
    }));

});

我正在尝试为所有 404 错误添加中间件

app.use(function(err, req, res, next) {
  console.error(err.message);
});

或者这不起作用

app.get('*', function(req, res){
  res.status(404).send('what???');
});

怎么了?

【问题讨论】:

    标签: javascript node.js express middleware


    【解决方案1】:

    在 Express 中,404 响应不是错误的结果,因此错误处理程序中间件不会捕获它们。这种行为是因为 404 响应只是表明没有额外的工作要做;也就是说,Express 已经执行了所有的中间件函数和路由,发现没有一个响应。您需要做的就是在堆栈的最底部(在所有其他函数下方)添加一个中间件函数来处理 404 响应:

    app.use(function (req, res, next) {
      res.status(404).send("Sorry can't find that!")
    })
    

    在运行时在 express.Router() 的实例上动态添加路由,这样路由就不会被中间件函数取代。

    参考:https://expressjs.com/en/starter/faq.html

    【讨论】:

    • 那么,express 不能只处理所有响应的错误吗?
    • 谢谢,非常有用。我想强调“在堆栈的最底部”的重要性!
    【解决方案2】:

    您可以将此middleware 添加到您的root 文件中。它会为任何无效路由发送错误。

     //Handles 404 errors
    app.use((req, res, next) => {
        const error = new Error('Error Occured');
        error.status = 404;
        next(error);
    });
    app.use((error, req, res, next) => {
        res.status(error.status || 500);
        res.json({
            error: {
                message: error.message
            }
        });
    });
    

    或者,您可以尝试捕获所有 404 错误

    app.use(function(req, res, next) {
        res.status(404).send( 'Error Occured! ');
    });
    

    【讨论】:

    • 这个方法不调用。我添加了这样的路线 app.use("/api/tobaccos", 烟草);
    • 当您尝试调用无效的routes 时会调用此middleware。例如,如果您尝试拨打'/api/tobacco/get' 显然不是您的route,那么它会响应error 消息。
    猜你喜欢
    • 1970-01-01
    • 2021-10-12
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多