web-dev-qa-db-ja.com

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

どうしましたか? deleteメソッドがtrueを返すのに何も起こらないのはなぜですか?ご協力いただきありがとうございます :)

13
ketysek

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

したがって、これらのポイントをクロスチェックしてください。詳細については、これを読むことができます Link

10
Virendra yadav

ただやる:

user.password = undefined;

の代わりに:

delete user.password;

また、パスワードプロパティは出力に表示されません。

2
LEMUEL ADANE

同様の問題がありました。特定の場合にオブジェクトからプロパティを削除しようとすると、delete演算子が「機能しませんでした」。 Lodashunsetを使用して修正:

_.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

0
Ruslan Suvorov