gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:48:21 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com