Express 4 +护照,req.user未定义 – 函数调用顺序?

我遇到了一个非常奇怪的问题。 我正试图让快递+护照工作。 由于绝大多数的在线示例都是针对快递3的,因此这个过程花了我一些时间 – 最终我获得了Google身份validation的function。 我试图将Google帐户绑定到本地帐户,该帐户需要从MongoDBsearch帐户。 以下是可用的代码部分:

//Serialize function passport.serializeUser(function(user, done) { done(null, user); }); //Deserialize function passport.deserializeUser(function(obj, done) { done(null, obj); }); //Strategy passport.use(new GoogleStrategy({ returnURL: 'http://localhost:8000/auth/google/return', realm: 'http://localhost:8000/' }, function(identifier, profile, done) { process.nextTick(function() { profile.identifier = identifier; return done(null, profile); }); } )); 

以下代码已经过validation可以使用。 一切都像一个魅力。 但是,当我修改代码如下:

 passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { //note that only change is to find user from database, User is a mongoose instance //very straightforward, verified user can be found. User.findById(id, function(err, user) { done(err, user); }); }); 

如果没有find,则策略被更改为创build用户:

  process.nextTick(function() { profile.id = identifier; User.findOne({ 'google.id': profile.id }, function(err, user) { if (err) { return done(err); // don't even know what done means! } else if (user) { return done(null, user); } else { //very easy to create and save to database. //create a new user instance var newUser = new User(); newUser.google.id = profile.id; newUser.google.name = profile.displayName; newUser.google.email = profile.emails[0].value; newUser.local.email = newUser.google.email; newUser.local.name = newUser.google.name; // newUser.id = newUser._id; //it should have been saved to database? newUser.save(function(err) { if (err) throw err; //The done is called once is saved. return done(null, newUser); }); } }); }); 

这是路由器,它被放置在所有必要的护照初始化之后。

 app.get('/', function(req, res) { console.log("Rendering..."); console.log(req.user); res.render('index', { user: req.user }); console.log("Rendering done..."); }); 

现在有趣的部分是:当我访问URLapp.get('/')的console.log在页面被加载后被调用,并且req.user不是未定义的。 当它工作时,console.log被调用的顺序是正确的。 看起来,当页面呈现时, req.user还没有初始化 – 但我只是无法弄清楚为什么console.log函数被称为AFTER res.render – 它对我来说没有任何意义。 这可能是一些asynchronous逻辑的结果…

任何人有任何想法? 谢谢。 我会将代码更新到Github

我也试过websocket来访问req.handshake.use r – 所有的数据都在那里。 不知何故res.render被调用,尚未初始化。