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を返すのに何も起こらないのはなぜですか?ご協力いただきありがとうございます :)
javaScriptの削除演算子には特定のルールがあります
例えば
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
例えば
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
ただやる:
user.password = undefined;
の代わりに:
delete user.password;
また、パスワードプロパティは出力に表示されません。
同様の問題がありました。特定の場合にオブジェクトからプロパティを削除しようとすると、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