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

更多详情:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

你应该使用:

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