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

Him*_*edi 7 mongodb node.js 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)
          }
     }
};
Run Code Online (Sandbox Code Playgroud)

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

我已经用 Express 应用程序对象注册了 JSON 解析器。如果错误是我在 POSTMAN 控制台中得到的响应

{
  code: 'ERR0001',
  msg: 'Facing issues while ....',
  err: {}
}
Run Code Online (Sandbox Code Playgroud)

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

{
  code: 'ERR0001',
  msg: 'Facing issues while ....',
  err: 'ERROR: whatever exception occurred on database operation...' 
}
Run Code Online (Sandbox Code Playgroud)

请帮助我了解此问题的原因。

Cur*_*ler 5

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

但是,由于该Error对象没有按照JSON.stringify()您的预期进行处理,因此您看不到它的内容;例如堆栈跟踪属性。

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

/sf/answers/1287398031/

Error因此,使用该答案的变体,当我想从 Express 向客户端发送回 Javascript 对象时,我会这样做:

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));
}
Run Code Online (Sandbox Code Playgroud)

然后在我的回复中调用它,如下所示:

res.status(500).json(getPureError(error));
Run Code Online (Sandbox Code Playgroud)

对 的调用会对对象getPureError()进行字符串化Error并获取所有属性,因为对replaceErrors(). 然后它将其解析回纯对象。当调用时,这个纯对象与 Express 配合得很好.json(),因此您可以获得您期望的所有属性。这有点浪费,但你得到了你想要的结果。

这导致我看到了完整的Error物体;堆栈跟踪和所有。

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

res.status(500).json(error);
Run Code Online (Sandbox Code Playgroud)

我正在{}服务器上回复我的回复。我花了一些时间才弄清楚那里发生了什么。我最初以为我没有json()错误地链接该命令,但事实确实如此。实际的问题是该Error对象的行为与JSON.stringify()上述其他对象不同。

我希望这对您或至少对其他人有帮助!