Node.js spread运算符似乎不复制完整对象

Node.js spread运算符似乎不复制完整对象,node.js,express,middleware,Node.js,Express,Middleware,我正在尝试实现快速错误处理中间件。它正在工作,但我不明白为什么我必须将error.message设置为等于errr.message复制error后的error.message。排列运算符是否没有从err复制所有属性?当我检查err对象时,我甚至看不到消息或堆栈属性。另外,为什么它能够在if块中创建错误消息之前记录错误消息 这就是我扩展错误的方式 //src/utils/errorResponse.js 类ErrorResponse扩展了错误{ 构造函数(消息、状态代码){ 超级(讯息) this

我正在尝试实现快速错误处理中间件。它正在工作,但我不明白为什么我必须将
error.message
设置为等于
errr.message
复制
error
后的
error.message
。排列运算符是否没有从
err
复制所有属性?当我检查err对象时,我甚至看不到消息或堆栈属性。另外,为什么它能够在if块中创建错误消息之前记录错误消息

这就是我扩展错误的方式

//src/utils/errorResponse.js
类ErrorResponse扩展了错误{
构造函数(消息、状态代码){
超级(讯息)
this.statusCode=statusCode
}
}
module.exports=错误响应
自定义错误处理程序中间件

//src/middleware/error.js
const ErrorResponse=require(“../utils/ErrorResponse”)
常量errorHandler=(错误、请求、恢复、下一步)=>{
let error={…err}
console.log({error.message})//未定义
error.message=err.message
console.log({error.message})/`找不到id为${err.value}的资源`
//登录到开发人员的控制台
//console.log(error.stack)
//猫鼬坏东西
如果(err.name=='CastError'){
const message=`找不到id为${err.value}的资源`
错误=新的错误响应(消息404)
}否则{
console.log(error.name)
}
res.status(error.statusCode | | 500).json({
成功:错,
错误:error.message | |“服务器错误”,
})
}
module.exports=errorHandler
我通过使用错误的ObjectID发出get请求来触发错误

//src/controllers/bootcamp.js
const Bootcamp=require(“../models/Bootcamp”)
...
//@desc获取单个训练营
//@route GET/api/v1/bootcamp/:id
//@access-Public
exports.getBootcamp=async(请求、恢复、下一步)=>{
试一试{
const bootcamp=wait bootcamp.findById(请求参数id)
如果(!训练营){
返回下一个(错误)
}
json({success:true,data:bootcamp})
}捕捉(错误){
下一个(错误)
}
}

之所以发生这种情况,是因为您获得的
err
参数属于错误类型对象,并且消息键存在于错误对象的原型中,而spread operator浅拷贝对象的键(不包括原型键)

来自mdn的spread运算符的语句-

ECMAScript提案的Rest/Spread属性(ES2018)将Spread属性添加到对象文本中。它将自己的可枚举属性从提供的对象复制到新对象上

现在可以使用比Object.assign()更短的语法进行浅层克隆
(不包括原型)
或对象合并

供参考-