Javascript 删除对象属性不起作用



我正在 MEAN 上运行一些项目.js我遇到了以下问题。我想对一些用户的配置文件进行计算并将其保存到数据库。但是用户模型中的方法存在问题:

UserSchema.pre('save', function(next) {
    if (this.password && this.password.length > 6) {
        this.salt = new Buffer(crypto.randomBytes(16).toString('base64'), 'base64');
        this.password = this.hashPassword(this.password);
    }
    next();
});

如果我发送包含更改的密码,它将更改凭据,因此用户下次无法登录。我想在保存之前从用户对象中删除密码,但我无法做到这一点(让我们看看下面代码中的注释(:

exports.signin = function(req, res, next) {
    passport.authenticate('local', function(err, user, info) {
        if (err || !user) {
            res.status(400).send(info);
        } else {
            /* Some calculations and user's object changes */
            req.login(user, function(err) {
                if(err) {
                    res.status(400).send(err);
                } else {
                    console.log(delete user.password); // returns true
                    console.log(user.password); // still returns password :(
                    //user.save();
                    //res.json(user);
                }
            });
        }
    })(req, res, next);
};

怎么了?为什么删除方法返回 true,但没有任何反应?感谢您的帮助:)

只需执行以下操作:

user.password = undefined;

而不是:

delete user.password;

并且密码属性不会出现在输出中。

JavaScript 中的删除运算符有一定的规则

  1. 如果该属性是"严格模式"下自己的不可配置属性,则它将返回 false。

例如

x = 42;         // creates the property x on the global object
var y = 43;     // creates the property y on the global object, and marks it as non-configurable
// x is a property of the global object and can be deleted
delete x;       // returns true
// y is not configurable, so it cannot be deleted                
delete y;       // returns false 
  1. 如果对象从原型继承属性,并且没有属性本身,则无法通过引用对象来删除该属性。但是,您可以直接在原型上删除它。

例如

function Foo(){}
Foo.prototype.bar = 42;
var foo = new Foo();
// returns true, but with no effect, 
// since bar is an inherited property
delete foo.bar;           
// logs 42, property still inherited
console.log(foo.bar);

因此,请交叉检查这些要点,有关更多信息,您可以阅读此链接

有类似的问题。这对我有用:

// create a new copy  
let newUser= ({...user}._doc); 
// delete the copy and use newUser that thereafter. 
delete newUser.password; 

与 MONGOOSE 合作?

如果您在使用 Mongoose(Mongo DB 的上层(时遇到此问题,那么您可以在find方法上使用lean属性

例子

没有精简(不会删除密钥(

const users = await User.find({ role: 'user' }) // no lean method
   users.forEach((user) => {
   delete user.password  // doesn't delete the password
})
console.log(users) 
/* [
    {name:'John', password:'123'}, 
    {name:'Susan', password:'456'}
   ] 
*/ 

使用精益(密钥被删除(

const users = await User.find({ role: 'user' }).lean() 
   users.forEach((user) => {
   delete user.password   // deletes the password
})
console.log(users) 
/* [
    {name:'John'}, 
    {name:'Susan'}
   ] 
*/ 

精益有效的原因

从启用了精益选项的查询返回的文档是纯 JavaScript 对象,而不是 Mongoose 文档。他们没有保存方法,getter/setter,虚拟或其他猫鼬功能。

文档是只读的,因此delete不适用于它们

参考资料 - https://stackoverflow.com/a/48137096/10824697https://mongoosejs.com/docs/api.html#query_Query-lean

方法2没有精益

如果要在查询时使用猫鼬提供的方法删除某些属性,可以使用select方法删除,

const users = await User.find({ role: 'user' }).select('-password')
console.log(users)
 /* [
      {name:'John'}, 
      {name:'Susan'}
    ] 
 */ 

Majed A 的上述答案是适用于单个对象属性的最简单解决方案,我们甚至可以通过移除...user吊具来使其更容易。 只需从object._doc子对象中删除该属性即可。 在您的示例中,它将是:

user.save()
delete user._doc.password
res.status(201).json(user) // The password will not be shown in JSON but it has been saved.

有类似的问题。在特定情况下尝试从对象中删除属性时,delete运算符"不起作用"。使用Lodash unset修复了它:

_.unset(user, "password");

https://lodash.com/docs/4.17.11#unset

否则,delete运算符确实有效。以防万一,delete操作员文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete

如果密码是用 defineProperty 定义的,那么如果未设置,则configurable默认为 false。在这种情况下,则无法删除该属性。

对我来说,node js 仍然告诉我该属性已删除(console.log(delete obj.prop)(,但它没有删除。

function test(settings) {
  settings = {...{c: false, w:false}, ...settings}
  let obj = {}
  Object.defineProperty(obj, "prop", {
    configurable: settings.c,
    enumerable: settings.e ?? true,
    writable: settings.w,
    value: "foo"
  });
  console.log(
    JSON.stringify(settings), 
    'nset value to 1', (function() {obj.prop = 1})() || "", 
    'nappended bar:', (function() {obj.prop += "bar"})() || "", 
    'nobj:', JSON.stringify(obj),
    'ndelete:', delete obj['prop'],
    'nobj:', JSON.stringify(obj))
}
console.log('baseline: unchangeable, undeletable');
test()
console.log('unchangeable, deletable');
test({c: true})
console.log('changeable, undeletable');
test({w: true})
console.log('changeable, deletable');
test({c: true, w: true})

最有可能的是,您要删除的属性尚未拥有此对象的属性。在这种情况下,操作的结果将显示true不会删除任何内容

你可以使用它。它跳过不需要的键而不是删除,然后返回对象。

Object = remove(Object, keyToRemove)

  let x = {1:1, 2:2}
    console.log('in', x)
    
    function remove(Object, key){
        let outputObject = {}
        for (let inKey in Object){
            if(key == inKey){
                console.log('key', key , 'was deleted')
            }else{
               outputObject[inKey] = Object[inKey]
            }
        }
        return outputObject
    }
 x = remove(x, 1)
    console.log('out', x)

相关内容

  • 没有找到相关文章

最新更新