node.js - Express Js 不在 res.json() 上发送错误对象

标签 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 应用对象注册了 JSON 解析器。 如果出现错误,我将在 POSTMAN 控制台中得到响应

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

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

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

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

最佳答案

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

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

有关 JSON.stringify()Error 对象的详细信息,请查看其他堆栈溢出答案(我不会在此处重复):

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

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

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));

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

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

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

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

我在服务器上的响应中返回了 {}。我花了一些时间来弄清楚那里发生了什么。我最初认为我没有错误地链接那个 json() 命令,但我是。实际问题是 Error 对象的行为与上述使用 JSON.stringify() 的其他对象不同。

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

关于node.js - Express Js 不在 res.json() 上发送错误对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47329632/

相关文章:

node.js - Mongoose 双向模型/多对多关系

node.js - sails :How to join two different models using waterline

node.js - 从 Express 服务器响应中获取/读取 res.status() 值

python - 使用 PyMongo 从 MongoDB 数据库中检索所有集合的所有文档

javascript - Node Mongoose 填充条件不返回预期结果

Node.js + Express : app won't start listening on port 80

node.js - 如何格式化 Mongoose 调试输出 - pretty-print

javascript - Node.js azure-storage TableService 没有方法

java - Mongo $pullAll 在对象数组上

javascript - 启用路由时 AngularJS 无法解析 Express render() 中的 View 参数