NodeJS 在Express框架中,next(error)和throw new Error有什么区别?

g52tjvyc  于 2023-04-05  发布在  Node.js
关注(0)|答案(2)|浏览(164)

有人能给我解释一下下面代码Express JS中两种异常错误处理方式的区别吗:

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

app.get('/test', (req, res, next) => {

  // the first way:
  throw new Error('my error message');

  // the second way:
  next(new Error('my error message'));

});

app.use((err, req, res, next) => {
  res.status(err.status || 500).send(err.message || 'Internal Server Error');
});

app.listen(3000, () => console.log('Welcome to ExpressJS'));

它返回错误中间件处理的相同结果,但这里有什么区别?

h5qlskok

h5qlskok1#

根据源代码,什么都没有。

try {
    fn(req, res, next);
  } catch (err) {
    next(err);
  }
inn6fuwd

inn6fuwd2#

我偶然发现了一个场景,下一个函数对我有意义。我创建了一个中间件来检查express路由中的必需参数,当我遇到两个或更多必需参数不满足的情况时,抛出Error将在第一个错误时停止请求。使用下一个函数,它不会在第一个错误时停止,实际上我得到了关于我需要满足的所有参数的消息,这就是我想要做的。代码片段:

export const validateParams = (params: string[]) => {
    return async (request: Request, response: Response, next: NextFunction) => {
    try {
        for (const field of params) {
        if (!request.body[field]) {
          next(new MissingParamError(field))
            // instead of 
            // throw new MissingParamError(field)
        }
      }
  return next()
    } catch (error) {
      if (error instanceof Error) return response.status(400).send(error.message);
    }
  };
};

相关问题