我应该如何在非中间件 (Passport.js) 中使用 req?

How should i use req inside non-middleware (Passport.js)?

我想在他或她每次登录时更新用户的 ip。

我被告知只有中间件才能获取 req、res 和 next 参数,但我使用的是 passportjs,它应该首先授权用户。我应该如何更新用户数据?

下面是我使用基本策略 passport.js 的代码块。

passport.use(new BasicStrategy(
    function(username, password, callback){
        User.findOne({username:username}, function(err,user){
            if(err){return callback(err);}
            //no user found with the email
            if(!user){return callback(null, false);}
            user.verifyPassword(password, function(err,isMatch){
                if(err){ return callback(err);}
                // password did not match
                if(!isMatch){return callback(null,false);}
                //success

                // UPDATE USER INFO
                user.token = jwt.sign(user.email+Date.now(), "testtoken");//should change later
                user.last_login = Date.now();

                // I AM TRYING TO UPDATE THIS WITH req.ip
                user.last_ip = req.ip;

                user.save(function(err, user1){
                    if(err) return callback(err);
                    return callback(null,user);
                });
            });
        });
    }
));

您可以配置 BasicStrategy 将请求作为第一个参数传递:

passport.use(
  new BasicStrategy({ passReqToCallback : true }, function(req, username, password, callback) {
    ...
  })
);

这(遗憾的是)没有很好的记录,但我相信大多数 Passport 策略都支持它 (see also)。