次の関数で名前が付けられた変数を再利用しようとしてuser
います:
UserModel.prototype.authenticate = function (doc, callback) {
// check to see if the username exists
this.users.findOne({ username: doc.username }, function (err, user) {
if (err || !user)
return callback(new Error('username not found'));
// hash the given password using salt from database
crypto.pbkdf2(doc.password, user.salt, 1, 32, function (err, derivedKey) {
if (err || user.password != derivedKey)
return callback(new Error('password mismatch'));
// explicitly define the user object
var user = {
_id: user._id,
type: user.type,
username: user.username,
displayname: user.displayname
};
return callback(err, user);
});
});
};
user
コールバック関数内で変数を再定義しようとしていpbkdf2
ます。これは私が期待するようには機能しません。実行時にここでは定義されていないため、比較する行がuser.password != derivedKey
壊れています。コールバック メソッド パラメーターからのインスタンスであってはなりuser
ませんか? 2 つの変数のいずれかを別の名前に変更すると、機能します。user
findOne
user
変数の名前を変更することもできますが、それでも不思議に思うでしょう。