6

我有一个调用函数a,它接受一个回调,如果有一个错误,就会调用它。

a在 Express 路由请求中调用。如果有错误,错误应该是请求的响应。

function a(cb) {
  cb(new Error('Some error message'))
}

app.get('/', function (req, res) {
  a(function (error) {
    if (error) {
      res.json(error, 400)
    }
    res.send('No error')
  })
})

我已经查看了 Express 的代码,它似乎res.json会将我的error. 但是,这样做的结果是一个空字符串:

> var e = new Error('Some error message')
undefined
> JSON.stringify(e)
'{}'
> e.message
'Some error message'

有一些方法可以让我的路线在此处返回错误消息,例如toString在我的路线中转换错误对象。但是,我想知道在 Node API 中格式化错误消息的最佳实践是什么,以及这是否会改变这里的情况。我应该以不同的方式格式化我的错误消息,还是应该只处理Error路由中的对象,例如:

res.json({ error: error.message }, 400)
4

4 回答 4

5

要添加到@steveukx 的答案,您可以在 express 中指定一个错误处理程序,.use方法是使用 arity 为四的函数。

app.use(function(err, req, res, next){
  res.json(500, {
    error: err.message
  });
});

每当您这样做时都会调用它next(err)。请参阅文档

于 2013-04-22T13:34:38.810 回答
1

当没有发生错误时,我现在不知道您的响应是什么样的,但这是我通常处理 JSON 响应的方式:

function (err, data) {
    if (err) {
        res.json({
            success: false,
            error: err.message
        }, 400);
    }
    else {
        res.json({
            success: true,
            data: data
        });
    }
}

尝试将其包装在一个额外的中间件/函数中。保持函数的签名类似于标准节点样式。(第一个参数错误,后面的参数是实际数据。)这种方式很容易让客户端处理您的响应,因为您所要做的就是查看该success字段。

于 2013-04-22T12:09:52.593 回答
1

快速路由可以使用第三个参数next,它可以通过调用跳过当前路由next(),或者通过调用传递错误next(err)

尝试使用:

app.get('/', function (req, res, next) {
  a(function (error) {
    if (error) {
      next(error);
    }
    else {
      res.send('No error')
    }
  });
});

有关更多信息,请查看http://expressjs.com/api.html#app.param

于 2013-04-22T12:37:55.710 回答
0

抛出错误的正确方法是使用信息性错误而不是通用错误。仅当信息错误本身由于某种原因失败时,才应抛出通用错误。这是我使用的通用处理程序来演示自定义错误并退回到通用错误:

fpToExpressJson = async (response, next, fp, args) => {
  const oResponse = await fp(args).catch(err => err);

  if (!oResponse) {
    return next(createError(404));
  }

  if (oResponse.errorCode) {
    // Good job developer! You threw a descriptive error.
    try {
      return response.status(oResponse.errorCode).send(oResponse);
    } catch (error) {
      return next(error);
    }
  }

  return response.json(oResponse);
};
于 2018-12-06T23:11:00.490 回答