2012-11-08 114 views
0

我正在试图通过创建自己的猫鼬帐户后,注销用户时未定义功能错误...在路线/ index.js看起来护照注册错误与user.login

TypeError: undefined is not a function 
at /node_modules/passport/lib/passport/http/request.js:44:48 
at pass (/node_modules/passport/lib/passport/index.js:240:14) 
at Passport.serializeUser (/node_modules/passport/lib/passport/index.js:242:5) 
at IncomingMessage.req.login.req.logIn (/node_modules/passport/lib/passport/http/request.js:43:29) 
at Promise.<anonymous> (/routes/index.js:33:25) 
at Promise.addBack (/node_modules/mongoose/lib/promise.js:120:8) 

我的寄存器功能像这样:

exports.register = function (req, res) { 
// Generate salt 
Common.bcrypt.genSalt(function(err, salt) { 
    req.body.salt = salt; 
    // Generate hash 
    Common.bcrypt.hash(req.body.password, salt, function(error, hash) { 
     req.body.hash = hash; 
     // Remove clear text password 
     delete req.body.password; 
     // Save new user 
     new Model.User(req.body).save(function(err, user) { 
      console.log(err); 
      console.log(req); 
      if (user) { 
       req.login(user); 
       req.redirect('/'); 
      } else { 
       res.json(false); 
      } 
     }); 

    }); 
}); 

任何想法?

回答

2

如果你看看node_modules/passport/lib/passport/http/request.js,第44行第48列,你会看到功能done正在被调用。错误告诉你undefined is not a function,所以done没有定义。如果您查看同一文件的第29行,您会看到done是您应该传递给req.login函数的参数。换句话说,它期待回调,而你没有提供回调。也许是这样的:

if (user) { 
    req.login(user, function(err) { 
    if (err) { 
     return req.send('FAILBOAT!'); 
    } 
    return req.redirect('/'); 
    }); 
} 

虽然我用的护照,我不叫req.login直接,所以我不100%以上代码的含义确定。我还会指出,我在我的用户模型中完成了所有的bcrypt工作,这似乎是解决问题的一个更清晰的方法。

+0

似乎解决了这些错误,但现在它说登录失败:错误:无法序列化用户进入会话。 当我刚刚登录时,会话序列化工作正常,但是当我调用req.login方法时,它有序列化问题。有任何想法吗? –

+0

我在我的app.js中使用这个: passport.serializeUser(function(user,cb){cb(null,user.id)}); –

+0

我接受了你的答案 - 我发现当Mongoose返回保存时,它不会给我记录的ID,所以我需要弄清楚如何让它吐出来给我。 –