Express 错误处理

如果想构建一个丰富且完整的应用程序,错误处理是必不可少的环节。通过正确的错误处理机制,可以增强应用程序的健壮性、安全性和可维护性。

当我们在中间件中出现错误的时候,可以通过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)
})

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值