【问题标题】:How to catch 4xx and 5xx errors in express?如何在快递中捕获 4xx 和 5xx 错误?
【发布时间】:2021-06-29 17:14:28
【问题描述】:

假设用户正在创建一个帐户,但输入无效,因此我将错误发送到前端并返回 409 状态代码。但是当错误在服务器端时,我不想返回 409 状态码,而是 5xx 状态码。我怎样才能做到这一点?

exports.signup = (req, res) => {
  try {
    //pseudocode
    db.createUser(req.user);
    res.status(201).send("user created!");
  } catch (err) {
    const errors = { username: "", password: "" };
    //pseudocode
    forEach((error) => { 
        if(validation.error.username) {
          errors.username = validation.error.username
        } else {
          errors.password = validation.error.password
        })
    res.status(409).json(errors);
  }
};

【问题讨论】:

    标签: javascript node.js express try-catch http-status-codes


    【解决方案1】:

    不要在每个路由中处理错误,而是考虑使用一组错误处理中间件,如in this article 所述。例如:

    app.use(function handleNotFoundError(error, req, res, next) {
      if (error instanceof NotFoundError) {
        return res.status(HttpStatus.NOT_FOUND).send({
          httpStatus: HttpStatus.NOT_FOUND,
          message: error.message,
          error: {}
        });
      }
      next(error);
    });
    
    app.use(function handleValidationError(error, req, res, next) {
      if (error instanceof ValidationError) {
        return res
          .status(HttpStatus.BAD_REQUEST)
          .json({
            httpStatus: HttpStatus.BAD_REQUEST,
            message: error.message,
            validationErrors: error.validationErrors
          });
      }
      next(error);
    });
    
    // ... etc.
    

    这种方法的好处是创建了一个错误处理层,本质上包装了您的路由代码和相应的服务。然后后者应该只担心抛出正确的错误(按类型和相关数据)。

    您可以通过创建所谓的错误路由器来进一步采用这种方法:函数映射,使用NotFoundErrorValidationError 等作为键并将相应的处理程序作为值。再一次,好处是您不必担心在控制器和/或服务中发送“正确”的代码和数据;它的责任最终是抛出正确的错误。

    【讨论】:

      【解决方案2】:

      您可以在第一步验证输入并返回 4xx,以防它们无效。如果它们有效,则在第二步中,您可以存储数据并在服务器端发生错误时返回 5xx 状态码。

      【讨论】:

        猜你喜欢
        • 2012-06-26
        • 2023-01-23
        • 1970-01-01
        • 2011-10-02
        • 2021-09-02
        • 2021-05-21
        • 1970-01-01
        • 1970-01-01
        • 2018-01-26
        相关资源
        最近更新 更多