如何删除req.user对象键值对 为何delete操作符不生效
问题原因
你遇到的delete操作不生效通常是以下几种情况导致的:
new Object()传入非原始值时不会生成新对象:如果req.user本身就是对象类型,let test = new Object(req.user)只是把原req.user的引用赋值给test,你操作的依然是原始的req.user对象,没有生成独立副本。- 属性不可配置:大部分鉴权中间件(比如Passport.js)生成的
req.user对象的敏感属性(比如password)的属性描述符configurable被设为false,这种情况下delete操作会静默失败,严格模式下会直接抛出错误。 - 属性挂载在原型链上:如果
password不是req.user实例自身的属性,而是定义在其构造函数的原型上,你删除实例属性的操作不会影响原型链上的属性,访问时依然能拿到对应值。
解决方法
最推荐方案:解构生成新对象(不修改原req.user)
直接通过解构剔除不需要的属性,不会修改原始req.user,避免影响后续依赖req.user的逻辑:
// 剔除password属性,剩下的属性都放到test对象里 const { password, ...test } = req.user; console.log(test.password); // 输出undefined
可选方案:修改属性描述符后删除(仅当必须修改原对象时用)
如果确实需要删除原req.user上的属性,可以先修改属性的可配置权限再执行删除:
Object.defineProperty(req.user, 'password', { configurable: true }); delete req.user.password; console.log(req.user.password); // 输出undefined
注意:如果req.user被Object.freeze()冻结,这个方案也会失效,依然推荐用第一种方案生成新对象使用。
内容的提问来源于stack exchange,提问作者Cheetara
相关产品推荐
相关产品推荐

