Express Js没有在res.json()上发送错误对象

时间:2017-11-16 12:25:28

标签: node.js mongodb express

getUser: function(req, res){
    Model.getUser({}, function(error, models){
         if(error){
              let response = {
                  code: 'ERR0001',
                  msg: 'Facing issues while ....',
                  err: error
              }
              res.json(response);
          } else {
              res.json(models)
          }
     }
};

以上代码适用于所有积极方案。但是对于错误情况,我没有收到完整的错误消息,而是显示“错误:{}”。

我已经使用Express app对象注册了JSON解析器。 响应我在POSTMAN控制台中遇到错误

{
  code: 'ERR0001',
  msg: 'Facing issues while ....',
  err: {}
}

根据我的要求,它应该显示如下内容:

{
  code: 'ERR0001',
  msg: 'Facing issues while ....',
  err: 'ERROR: whatever exception occurred on database operation...' 
}

请帮助我理解这个问题的原因。

1 个答案:

答案 0 :(得分:1)

当您使用res.json()时,Express会将您的JSON响应字符串化。

但是,由于Error对象并没有像您期望的那样被JSON.stringify()处理,因此您看不到它的内容。例如堆栈跟踪属性。

有关JSON.stringify()Error对象发生了什么的详细信息,请查看另一个堆栈溢出答案(在这里我不会重复):

https://stackoverflow.com/a/18391400/2387067

因此,使用该答案的变体,当我想将Javascript Error对象从Express发送回客户端时,将执行此操作:

function replaceErrors(key, value) {
    if (value instanceof Error) {
        var error = {};

        Object.getOwnPropertyNames(value).forEach(function (key) {
            error[key] = value[key];
        });

        return error;
    }

    return value;
}

function getPureError(error) {
    return JSON.parse(JSON.stringify(error, replaceErrors));
}

然后在这样的响应中对其进行调用:

res.status(500).json(getPureError(error));

由于对getPureError()的调用,对Error的调用将对replaceErrors()对象进行字符串化,并获取所有属性。然后将其解析回一个纯对象。进行.json()调用时,该纯对象可以与Express很好地配合使用,以便获得所需的所有属性。这有点浪费,但是您得到想要的结果。

这导致我看到完整的Error对象;堆栈跟踪等等。

当我第一次遇到这个问题时,我就是在这样做:

res.status(500).json(error);

,我在服务器上的回复中是{}。我花了一些时间来整理那里发生的事情。我本来以为我没有错误地链接该json()命令,但是我确实是。实际的问题是,Error对象的行为与如上所述的其他带有JSON.stringify()的对象不同。

希望所有这些时间对您或至少其他人有帮助!