在Passport.js中configuration本地策略

我有点新Node.js和以下是我的问题。

我有这样的代码,

passport.authenticate('local', function (error, user, info) { console.log("authentication happening"); console.log(info); if (error) { return res.send(error); } else if (!user) { return res.send("User not found"); } else { req.logIn(user, function (error) { if (error) { return res.send(error); } else { return res.json( { id: user }); } }); } return false; })(req, res, next); 

//如果我删除了最后一组参数,它不会给出错误,它会做什么? 即使我删除这个,它仍然不会发送回应。

而我的战略设置代码如下,

 passport.use(new LocalStrategy(function (username, password, done) { userManager.findOne(username, function (err, user) { if (err) { return done(err); } if (!user) { return done(null, false, { message: 'Incorrect username.' }); } userManager.isValidPassword(username, password, function (error, result){ if (result === true) { return done(null, user, { message: 'success' }); } else { return done(null, false, { message: 'Incorrect password.' }); } }); return done("error", false, { message: 'Error' }); }); })); 

但是,当我运行这个错误如下,

 D:\Education\Projects\Social\social\Dev\server\NodeProject\node_modules\mongodb\lib\mongodb\connection\base.js:242 throw message; ^ TypeError: object is not a function at D:\Education\Projects\Social\social\Dev\server\NodeProject\node_modules\mongodb\lib\mongodb\collection\query.js:147:5 at Cursor.nextObject (D:\Education\Projects\Social\social\Dev\server\NodeProject\node_modules\mongodb\lib\mongodb\cursor.js:733:5) at commandHandler (D:\Education\Projects\Social\social\Dev\server\NodeProject\node_modules\mongodb\lib\mongodb\cursor.js:713:14) at D:\Education\Projects\Social\social\Dev\server\NodeProject\node_modules\mongodb\lib\mongodb\db.js:1806:9 at Server.Base._callHandler (D:\Education\Projects\Social\social\Dev\server\NodeProject\node_modules\mongodb\lib\mongodb\connection\base.js:442:41) at D:\Education\Projects\Social\social\Dev\server\NodeProject\node_modules\mongodb\lib\mongodb\connection\server.js:485:18 at MongoReply.parseBody (D:\Education\Projects\Social\social\Dev\server\NodeProject\node_modules\mongodb\lib\mongodb\responses\mongo_reply.js:68:5) at null.<anonymous> (D:\Education\Projects\Social\social\Dev\server\NodeProject\node_modules\mongodb\lib\mongodb\connection\server.js:443:20) at EventEmitter.emit (events.js:95:17) at null.<anonymous> (D:\Education\Projects\Social\social\Dev\server\NodeProject\node_modules\mongodb\lib\mongodb\connection\connection_pool.js:191:13) 

你的passport.authenticate看起来很奇怪

以下是我们在工作副本中的代码:

 app.post('/login', passport.authenticate('local', { failureRedirect: failRedirect, failureFlash: false }), function(req, res) { log.info(req.user.username+' is successfully logged in.'); log.info(JSON.stringify(req.user)); res.redirect(successRedirect); }); 

passport.authenticate没有第二个参数作为callback。 相反,它会返回true或false以允许redirect发生。 所以,如果login成功,authentication调用将返回true,下一个函数将被调用, res.redirect(successRedirect)将会发生。 否则, failRedirect将被发送给用户,并将用户redirect到login失败页面。

这是我们的策略代码:

 passport.use(new LocalStrategy(function(username,password,done){ log.info(username+"//"+password+" is trying to login as local."); var userModel = mongoose.model('users',userSchema); userModel.findOne({'username':username}) .exec(function(err,puser){ if(err){log.info(err.stack);} if(!puser){ log.info("user not found."); return done(null, false, { message: 'Unknown user ' + username }); } if (password!==puser.password) { log.info("password invalid."); return done(null, false, { message: 'Invalid password' }); } return done(null, puser); }); })); 

你这个部分的策略看起来不错。


编辑:

现在你的回答向我解释了为什么你看到错误。

 app.get('/login', function(req, res, next) { passport.authenticate('local', function(err, user, info) { if (err) { return next(err); } if (!user) { return res.redirect('/login'); } req.logIn(user, function(err) { if (err) { return next(err); } return res.redirect('/users/' + user.username); }); })(req, res, next); }); 

比较你的代码:

 passport.authenticate('local', function (error, user, info) { ...implementation })(req, res, next); 

是非常不同的。

必须在app.get('path',method)调用function(req,res,next){(passport.authentication)(req,res,next)} 。 在这种情况下,有3个参数从express.get调用提供。 因此, req,res,next其实可以执行示例中所示的方式。 如果你拿(passport.authentication)(req,res,next) outside, req,res,next就不会被填充。 你的代码会失败。