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/