【问题标题】:Weird behavior of es6 object spread [duplicate]es6对象传播的奇怪行为[重复]
【发布时间】:2020-03-08 14:31:32
【问题描述】:

我有下面的例子

module.exports = (err, req, res, next) => {
  err.statusCode = err.statusCode || 500;
  err.status = err.status || 'error';

  if (process.env.NODE_ENV === 'development') {
    sendDevError(err, req, res);
  } else if (process.env.NODE_ENV === 'production') {
    console.log(err); // { message: 'test message', statusCode: '404', status: 'failed' }
    let error = { ...err };
    console.log(error); // { statusCode: '404', status: 'failed' }
    // error.message = err.message;
    if (error.name === 'CastError') error = handleCastErrorDB(error);
    if (error.code === 11000) error = handleDuplicateFieldsDB(error);
    if (error.name === 'ValidationError')
      error = handleValidationErrorDB(error);
    if (error.name === 'JsonWebTokenError') error = handleJWTError();
    if (error.name === 'TokenExpiredError') error = handleJWTExpiredError();
    sendProdError(error, req, res);
  }
};

魔法伴随着物体的传播。当我克隆err 对象时,由于某种原因,我的克隆对象中缺少message 属性。我通过在对象传播后放置error.message = err.message 解决了这个问题。但是这种方法并不是我想要实现的。有人可以解释一下对象传播是如何在幕后工作的吗?我能做些什么来解决这个奇怪的错误?

【问题讨论】:

标签: javascript node.js express


【解决方案1】:

我想你是在问为什么message 在你这样做时没有被复制:

let error = { ...err };

答案是属性传播只处理源对象的拥有、可枚举属性。 Error 实例中的 message property 是继承属性,而不是“自己的”属性。

这里有一个例子展示了这种区别:

const p = {message: "value"};
const c = Object.create(p);
c.own = "prop";
console.log(c.message);                   // "value";
console.log("message" in c);              // true
console.log(c.hasOwnProperty("message")); // false

console.log({...c}); // {"own": "prop"}

// Copy message onto the object
c.message = c.message;
console.log({...c}); // {"own": "prop", "message": "value"}
.as-console-wrapper {
    max-height: 100% !important;
}

【讨论】:

    猜你喜欢
    • 2021-12-13
    相关资源
    最近更新 更多