web-dev-qa-db-fra.com

Javascript supprimer la propriété d'objet ne fonctionne pas

J'exécute un projet sur MEAN.js et j'ai un problème suivant. Je veux faire un calcul de profil d'utilisateur et l'enregistrer dans la base de données. Mais il y a un problème avec la méthode dans le modèle des utilisateurs:

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();
});

Si j'envoie un mot de passe avec mes modifications, il modifiera les informations d'identification, donc l'utilisateur ne pourra pas se connecter la prochaine fois. Je veux supprimer le mot de passe de l'objet utilisateur avant de l'enregistrer, mais je ne suis pas en mesure de le faire (regardons les commentaires dans mon code ci-dessous):

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);
};

Qu'est-ce qui ne va pas? Pourquoi la méthode delete renvoie true, mais rien ne se passe? Merci de votre aide :)

13
ketysek

il y a certaines règles pour supprimer l'opérateur en javascript

  1. si la propriété est une propre propriété non configurable en "mode strict", elle retournera false.

par exemple

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. Si l'objet hérite d'une propriété d'un prototype et n'a pas la propriété elle-même, la propriété ne peut pas être supprimée en référençant l'objet. Vous pouvez cependant le supprimer directement sur le prototype.

par exemple

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);

donc, veuillez vérifier ces points et pour plus d'informations, vous pouvez lire ceci Lien

10
Virendra yadav

Faites juste:

user.password = undefined;

au lieu de:

delete user.password;

et la propriété de mot de passe n'apparaîtra pas à la sortie.

2
LEMUEL ADANE

Eu un problème similaire. L'opérateur delete "ne fonctionnait pas" lors de la tentative de suppression d'une propriété d'un objet dans un cas spécifique. Corrigé avec Lodashunset:

_.unset(user, "password");

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

Sinon, l'opérateur delete fonctionne. Au cas où, delete les documents de l'opérateur ici: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete

0
Ruslan Suvorov