错误处理
约 317 字大约 1 分钟
2025-07-28
通常错误处理中间件放在所有中间件与路由调用完后。
const bodyParser = require("body-parser");
const methodOverride = require("method-override");
app.use(
bodyParser.urlencoded({
extended: true,
})
);
app.use(bodyParser.json());
app.use(methodOverride());
app.use((err, req, res, next) => {
// logic
});
错误处理函数必须有四个参数(err,req,res,next),缺一不可,否则不会被当作错误处理中间件。
app.use((err, req, res, next) => {
console.log(err);
res.status(err.status || 500);
});
向 next() 函数传递的任何内容(字符串 'route' 除外),Express 会将当前请求视为错误,并跳过任何剩余的非错误处理路由和中间件函数,其内容将被错误函数的 err
捕获。
router.get('/', (req, res, next) => {
try {
const res = await getDB()
res.status(200).json(res)
}catch (err) {
next(err) // 必须使用 next() 传递错误,否则错误函数不会捕获错误。
}
})
从 Express 5 开始,返回 Promise 的路由处理程序和中间件在拒绝或抛出错误时将自动调用 next(value)。例如:
app.get("/user/:id", async (req, res, next) => {
const user = await getUserById(req.params.id);
res.send(user);
});
如果 getUserById 抛出错误或拒绝,next 将被调用,参数为抛出的错误或拒绝的值。如果没有提供拒绝的值,next 将以 Express 路由器提供的默认 Error 对象调用。