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...'
}
请帮助我理解这个问题的原因。
答案 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()
的对象不同。
希望所有这些时间对您或至少其他人有帮助!