【问题标题】:Javascript object property isn't displayed but can be accessedJavascript 对象属性不显示但可以访问
【发布时间】:2022-01-22 15:36:53
【问题描述】:

我正在创建一个自定义 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

我不知道它为什么会这样,但解决方法是什么?

【问题讨论】:

    标签: javascript express mongoose middleware


    【解决方案1】:

    你应该使用:

    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
    

    【讨论】:

      【解决方案2】:

      似乎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

      【讨论】:

      • 这使它工作:Object.defineProperty(error, 'message', {enumerable: true, value: error.message});谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2015-06-26
      • 1970-01-01
      • 1970-01-01
      • 2011-09-11
      • 1970-01-01
      • 2013-07-21
      相关资源
      最近更新 更多