简体   繁体   中英

Javascript object property isn't displayed but can be accessed

i'm creating a custom express middleware to handle errors thrown by mongoose. the error has a message property:

//works as intended
console.log(error.message); //E11000 duplicate key error collection

but when i want to send the entire object, the message property doesn't show up:

res.status(400).json(error);
/*
recieved response:
{
    "index": 0,
    "code": 11000,
    "keyPattern": {
        "name": 1
    },
    "keyValue": {
        "name": "Some Name"
    }
}
*/

destructuring doesn't work either:

res.status(400).json({ ...error });
//same response as before

it doesn't show it in Object.keys() either:

console.log(Object.keys(error)); //[ 'index', 'code', 'keyPattern', 'keyValue' ]

but this statement is true:

console.log("message" in error); //true

i don't know why it behaves this way but what is the workaround?

Seems like the message property on error object is non-enumerable . If a property is non-enumerable , it cannot be serialised ( res.json serialises the input JSON), won't appear in Object.keys or get destructured .

Your best bet is either to explicitly set the enumerable as true on error.message , or copy the error.message on some other key inside error object.

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

More details: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

you should use:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM