1

Compoundjs、Passportjs (compound-passport)、および Bcryptjs を使用してローカル認証を実装しようとしています。これが私のコードです:

新しい戦略を定義する

var Strategy = require('passport-local').Strategy;
passport.use(new Strategy({
    usernameField: conf.usernameField || 'email'
}, exports.callback));

コールバック関数

exports.callback = function (email, password, done) { 
    exports.User.findOrCreate({
        email: email,
        password: password
    }, function (err, user) {
        if (err) {
            return done(err);
        }
        if (!user) {
            return done(err, false);
        }
        var len = exports.User.verifyPassword.length;
        if (len === 2) {
            if (!exports.User.verifyPassword(password, user.password)) {
                return done(err, false);
            } else {
                return done(err, user);
            }
        } else if (len === 3) {
            exports.User.verifyPassword(password, user.password, function(err, isMatch) {
                return done(err, !err && isMatch ? user : false);
            });
        }
        return done(err, false);
    });
};

User.verifyPassword

User.verifyPassword = function verifyPassword(password, hash, cb) {
    bcrypt.compare(password, hash, function(err, isMatch) {
        if(err) return cb(err);
        return cb(null, isMatch);
    });
};

この場合、次のエラーが発生します。

エラー: 送信後にヘッダーを設定できません。

ログイン成功後のリダイレクトを指します。コールバック (同期モード) なしで verifyPassword を使用すると、正常に動作します。

User.verifyPassword = function verifyPassword(password, hash) {
    return bcrypt.compareSync(password, hash);
};

コードのどこにエラーがありますか?

4

1 に答える 1

0

次のスニペットに示されているように、おそらく done() への最後の呼び出しに else ステートメントを追加する必要があります。

if (len === 2) {
    if (!exports.User.verifyPassword(password, user.password)) {
        return done(err, false);
    } else {
        return done(err, user);
    }
} else if (len === 3) {
    exports.User.verifyPassword(password, user.password, function(err, isMatch) {
        return done(err, !err && isMatch ? user : false);
    });
}
else {
    // Added an ELSE statement here
    return done(err, false);
}

このelseステートメントがなければ、 exports.User.verifyPassword() への呼び出しが行われ、かつ return done(err,false) への呼び出しが行われます...そして最終的には、verifyPassword() があなたが与えたコールバック。

done() への 2 番目の呼び出しは、おそらくヘッダーが設定されているエラーを生成しているものです。

于 2014-02-12T13:48:14.203 に答える