我正在創建一個自定義快速中間件來處理貓鼬拋出的錯誤。在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
我不知道為什么它會這樣,但解決方法是什么?
uj5u.com熱心網友回復:
似乎物件message上的error屬性是non-enumerable. 如果屬性是non-enumerable,則它不能被序列化(res.json序列化輸入 JSON),不會出現在Object.keys或 中destructured。
最好的辦法是顯式設定enumerableas trueon error.message,或者復制error.messageonerror物件內部的某個其他鍵。
// 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
uj5u.com熱心網友回復:
你應該使用:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/390753.html
標籤:javascript 表达 猫鼬 中间件
