创建在Express请求中返回的错误消息的正确方法是什么?

时间:2013-04-22 11:50:33

标签: javascript node.js error-handling express

我有一个名为a的函数,它接受一个回调函数,如果有错误则调用该函数。

在Express路由请求中调用

a。如果出现错误,则错误应该是请求的响应。

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 个答案:

答案 0 :(得分:5)

要添加到@ steveukx的答案,您可以通过.use一个arity为4的函数在express中指定错误处理程序。

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

每当您执行next(err)时都会调用。 请参阅the docs

答案 1 :(得分:1)

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

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

尝试将其包装在额外的中间件/功能中。保持函数的签名类似于标准节点样式。 (第一个参数错误,跟随参数实际数据。)这样,客户端可以很容易地处理您的响应,因为您只需要查看success字段。

答案 2 :(得分:1)

Express路由可以使用第三个参数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

答案 3 :(得分: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);
};