【问题标题】:Next(err) handler message in express.jsexpress.js 中的 Next(err) 处理程序消息
【发布时间】:2020-05-04 05:23:52
【问题描述】:

我是 express 错误处理的新手,我有一段简单的代码,像这样 -

const express = require('express');
const MongoClient = require('mongodb').MongoClient;

const app = express();

let url = 'mongodb://localhost:27017';

app.use(bodyParser.urlencoded({extended:true}));
app.use(bodyParser.json());

app.use((err,req,res,next) => {
    console.log(`The error message is ${err}`)
    res.status(err.httpStatusCode).send('SOMETHING BROKE!');
})

app.get('/',function(req,res,next){
    MongoClient.connect(url,function(error,client){
        if(error){
            error.httpStatusCode = 500;
            return next(error);
        }
        res.send('Connected successfully!');
    })
})

我已经关闭了与 mongodb 的连接,所以失败了。显示错误并且应用程序没有崩溃,但我没有从我的快速错误处理程序中得到“SOMETHING BROKE”或console.log() 部分。我哪里错了?

【问题讨论】:

    标签: javascript node.js express error-handling


    【解决方案1】:

    最后放错误处理中间件 Express error handling

    app.get('/',function(req,res,next){
        MongoClient.connect(url,function(error,client){
            if(error){
                error.httpStatusCode = 500;
                return next(error);
            }
            res.send('Connected successfully!');
        })
    })
    
    app.use((err,req,res,next) => {
        console.log(`The error message is ${err}`)
        res.status(err.httpStatusCode).send('SOMETHING BROKE!');
    })
    

    【讨论】:

    • 这对我有用。非常感谢!所以错误处理程序必须始终存在于最后?
    • 是的,默认的错误处理中间件函数应该添加到中间件函数堆栈的末尾。
    • 非常感谢。
    【解决方案2】:

    当您在 Express 中调用 next(err) 时,它会调度到默认的 Express 错误处理程序,这不是什么漂亮的东西。

    但是,您通常会提供自己的错误处理程序,如下所示:

    app.use(function (err, req, res, next) {
      console.error(err.stack)
      // send your own custom error response here
      res.status(somethingAppropriate).send("something here");
    });
    

    您可以在 Express 文档中了解这种类型的 Express 错误处理 here。这些是一种特定类型的中间件,具有四个参数,而不是通常的三个参数,并且首先具有 err 参数。它还需要在您对路由器和中间件的定义中排在最后(因此它会在最后处理)。


    您也不必集中处理错误。我发现很多时候,我想发送一个非常特定于发生错误的上下文的错误。在这种情况下,我只是在发生错误的路由处理程序中捕获错误并从此处发送错误响应。

    例如,您可以这样做:

    app.get('/',function(req,res,next){
        MongoClient.connect(url,function(error,client){
            if(error){
                res.status(500).send("Database offline - notify system administrator or please try back shortly");
            } else {
                res.send('Connected successfully!');
            }
        })
    })
    

    【讨论】:

    • Err,我已经把错误处理程序。只是我在获取请求的开头使用了代码片段,所以它不起作用。我按照@Azad 的建议将其切换到代码的末尾,并且效果很好。
    • @SushmitChakraborty - 请注意我添加到答案末尾的另一个选项。我实际上发现这比最后的通用错误处理程序更有用。
    • 感谢您的提示,不胜感激。我只是想做一个集中​​式错误处理程序,因为它是一个相当小的项目,但我会记住这一点。
    猜你喜欢
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 2021-04-25
    相关资源
    最近更新 更多