Javascript 对象 属性 未显示但可以访问
Javascript object property isn't displayed but can be accessed
我正在创建一个自定义 express 中间件来处理 mongoose 抛出的错误。
error
有一个 message
属性:
//works as intended
console.log(error.message); //E11000 duplicate key error collection
但是当我想发送整个对象时,message
属性 没有出现:
res.status(400).json(error);
/*
recieved response:
{
"index": 0,
"code": 11000,
"keyPattern": {
"name": 1
},
"keyValue": {
"name": "Some Name"
}
}
*/
解构也不起作用:
res.status(400).json({ ...error });
//same response as before
它也没有在 Object.keys() 中显示:
console.log(Object.keys(error)); //[ 'index', 'code', 'keyPattern', 'keyValue' ]
但这个说法是正确的:
console.log("message" in error); //true
我不知道为什么会这样,但解决方法是什么?
error
对象上的 message
属性 似乎是 non-enumerable
。如果一个属性是non-enumerable
,它不能被序列化(res.json
序列化输入JSON),不会出现在Object.keys
或得到destructured
.
您最好的选择是在 error.message
上将 enumerable
显式设置为 true
,或者将 error.message
复制到 error
中的某个其他键上对象。
// For initialisation
Object.defineProperty(error, 'message', {enumerable: true, value: ''});
//OR
const errorMessage = error.message;
error.customMessage = errorMessage;
// Now use error.customMessage instead of error.message
// OR
// Create a new object with the above retrieved error.message
const customError = {...error, message: customMessage};
// use customError object now
res.status(400).json(customError);
你应该使用:
let message = `${Object.values(error.keyValue)} is duplicated/already exists, please choose another one`
console.log(message) // name is duplicated/already exists, please choose another one
我正在创建一个自定义 express 中间件来处理 mongoose 抛出的错误。
error
有一个 message
属性:
//works as intended
console.log(error.message); //E11000 duplicate key error collection
但是当我想发送整个对象时,message
属性 没有出现:
res.status(400).json(error);
/*
recieved response:
{
"index": 0,
"code": 11000,
"keyPattern": {
"name": 1
},
"keyValue": {
"name": "Some Name"
}
}
*/
解构也不起作用:
res.status(400).json({ ...error });
//same response as before
它也没有在 Object.keys() 中显示:
console.log(Object.keys(error)); //[ 'index', 'code', 'keyPattern', 'keyValue' ]
但这个说法是正确的:
console.log("message" in error); //true
我不知道为什么会这样,但解决方法是什么?
error
对象上的 message
属性 似乎是 non-enumerable
。如果一个属性是non-enumerable
,它不能被序列化(res.json
序列化输入JSON),不会出现在Object.keys
或得到destructured
.
您最好的选择是在 error.message
上将 enumerable
显式设置为 true
,或者将 error.message
复制到 error
中的某个其他键上对象。
// For initialisation
Object.defineProperty(error, 'message', {enumerable: true, value: ''});
//OR
const errorMessage = error.message;
error.customMessage = errorMessage;
// Now use error.customMessage instead of error.message
// OR
// Create a new object with the above retrieved error.message
const customError = {...error, message: customMessage};
// use customError object now
res.status(400).json(customError);
你应该使用:
let message = `${Object.values(error.keyValue)} is duplicated/already exists, please choose another one`
console.log(message) // name is duplicated/already exists, please choose another one