Express的错误处理

338 阅读2分钟

一个程序出现错误是不可避免的,无论是用户输入的错误,还是功能逻辑设计不对所引发的错误,这些都会导致程序宕机。对于JavaScript这样的单线程语言来说,错误处理应当更加谨慎。Node.js中出现的错误可以采用try...catch语句进行处理,格式如下:

try {
    // 可能出现错误的操作
} catch (err) {
    // 错误发生时处理
}

如果对每一个特定的错误都进行处理,无疑会出现非常多的冗余代码,所以一般采用统一的方式处理错误。Express提供了非常方便的错误处理方式:中间件。Express会捕获所有可能出现的错误,确保所有的错误都通过错误处理中间件来处理。

中间件不一定非要处于用户请求与逻辑处理的中间层,在所有的Express路由处理中包含第3个参数next,该参数用于调用执行完中间件的逻辑代码之后的下一个中间件。如果用于错误处理,自然也可以将产生的错误传递给错误逻辑中间件。

Express一般使用如下代码进行错误传输:

next(err)

Express提供了一个内置的方法用来处理可能出现的任何错误,其代码如下:

function errorHandler (err, req, res, next) {
    if (res.headersSent) {
        return next(err);
    }
    res.status(500);
    res.render("error", { error: err });
}

在某些业务需求中,JavaScript可以自行实例化一个Error()抛出错误,这种方式多用于某些敏感且危险的操作,通过主动抛出错误的方式停止业务流程,宕机也是一种及时的止损。

throw new Error("服务出现错误");

Express中的错误处理可以依赖于自身的错误处理函数,下面的代码使用throw抛出一个错误:

const express = require("express");
const app = express();

app.get("/", function (req, res, next) {
    // 新建错误
    try {
        throw new Error("抛出一个错误");
    } catch (err) {
        next(err);
    }
});

app.listen(3000);

这样就可以调用默认的统一错误处理函数即 errorHandler()函数,返回一个服务端错误,状态码为500。

当然,也可以不使用Express中的错误处理中间件,自主定义其他的错误处理中间件进行处理。

使用Express编写的错误处理中间件。

const express = require("express");
const app = express();

// 路由定义
app.get("/", function (req, res, next) {
    try {
        // 新建错误
        throw new Error("抛出一个错误");
    } catch (err) {
        next(err);
    }    
});

// 自定义的错误处理中间件
app.use((err, req, res, next) => {
    res.send("出现错误!");
});

app.listen(3000);

上述代码并不返回状态码为500的服务器错误,只是返回一个简单的提示语句。需要注意的是,在错误处理中间件中,使用next()函数可以传递错误,这个错误会传递给默认的处理函数。