如果想构建一个丰富且完整的应用程序,错误处理是必不可少的环节。通过正确的错误处理机制,可以增强应用程序的健壮性、安全性和可维护性。
当我们在中间件中出现错误的时候,可以通过next(err)来传递。next一旦接收了err参数之后,就会去执行它的错误处理中间件(err, req, res, next)=>{},这个中间件是express提供的,和普通中间件不同的是,它接收4个参数。
那么在express中该怎么做呢?
先看看一个例子。编辑 index.js
const express = require("express");
const loginRouter = require("./router/login.router");
const app = express();
const port = 3000;
app.use(express.json());
app.use("/login", loginRouter);
app.listen(port, () => {
console.log(`Example app listening on port ${port}`);
});
根目录下新建 router 文件夹及 login.router.js 文件。
// router/login.router.js
const express = require("express");
const router = express.Router();
router.post("/", function (req, res, next) {
const { name, age } = req.body;
if (!name || !age) {
res.json("name and age is required");
} else {
res.json("login success");
}
});
module.exports = router;
如上所示,虽然也可以这么处理,但是一旦遇到更多的判断和更多的请求,每个请求都这么处理,就会很低效。接下来看看怎么调用错误处理中间件。
constant.js
const NAME_AND_AGE_IS_REQUIRED = "name and age is required";
module.exports = {
NAME_AND_AGE_IS_REQUIRED,
};
router/login.router.js
const express = require("express");
const { NAME_AND_AGE_IS_REQUIRED } = require("../constant");
const router = express.Router();
router.post("/", function (req, res, next) {
const { name, age } = req.body;
if (!name || !age) {
next(new Error(NAME_AND_AGE_IS_REQUIRED));
} else {
res.json("login success");
}
});
module.exports = router;
index.js
const express = require("express");
const loginRouter = require("./router/login.router");
const { NAME_AND_AGE_IS_REQUIRED } = require("./constant");
const app = express();
const port = 3000;
app.use(express.json());
app.use("/login", loginRouter);
app.use((err, req, res, next) => {
switch (err.message) {
case NAME_AND_AGE_IS_REQUIRED:
res.status(201).json(NAME_AND_AGE_IS_REQUIRED);
break;
default:
break;
}
});
app.listen(port, () => {
console.log(`Example app listening on port ${port}`);
});
注:从 Express 5 开始,返回Promise的路由处理程序和中间件,将在 reject 或抛出错误时,自动调用 next(value)。
app.get('/user/:id', async function (req, res, next) {
var user = await getUserById(req.params.id)
res.send(user)
})