You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何删除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:06:03