2

次の関数で名前が付けられた変数を再利用しようとして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 つの変数のいずれかを別の名前に変更すると、機能します。userfindOneuser

変数の名前を変更することもできますが、それでも不思議に思うでしょう。

4

2 に答える 2

1

答えは、巻き上げのため、他の式で変数を使用した後users( )変数を宣言しても( )、最初に解析され、元の参照が上書きされたままになるということです。そこにホイストに関するいくつかのドキュメントがあり、それらのピークを取ることは良い考えかもしれません.var usersuser.password != derivedKeyusers

于 2012-10-23T15:57:23.067 に答える