了解PassportJS中的完成function

我正在尝试实现一个正常的login和注册模块,我很难理解done函数。 这里是我感觉负责完成function的行。 现在我想要做的就是返回相应的消息,如有一些服务器错误。

app.post('/user/auth/login', passport.authenticate('local-login'), function(req, res) { console.log("Login Request Successful"); if(req.user){ res.status(200).send(JSON.stringify({ 'msg' : "Successfully logged in" })); } else{ res.status(400) } //console.log(req.user); }); 

这是在loginPassport后将用户对象附加到请求模块的情况。 但是,如何区分服务器错误和身份validation失败错误

这是我的身份validation中间件。

 passport.use('local-login', new LocalStrategy({ passReqToCallback: true }, function(req, username, password, done) { Users.findOne({ 'emailId': username }, function(err, user) { if (err) return done(err); if (!user) return done(null, false); else if (passwordHash.verify(password, user.password)) { console.log("User is verified"); req.session.save(); return done(null, user); } else return done(null, false); }); })); 

基本上,我需要访问done()函数中的消息。 我怎么做?

function如何,就像我input错误的密码,我在我的浏览器中获得的信息在未经授权。 这意味着它将response.data字段设置为Unauthorized。 而不是我想知道什么时候出现错误,并想发送我的自定义消息。

我不知道你是什么意思

访问done()函数中的消息

,但是你可以很好地提供添加对象消息在完成callback

 if (!user) { return done(null, false, { message: 'Unknown user or invalid password' }); } if (!user.authenticate(password)) { return done(null, false, { message: 'Unknown user or invalid password' }); } 

另一种方法。 我不知道我错过了什么。 在文档中有自定义callback的选项。 这里是执行相同的。

  app.post('/user/auth/login', function(req, res) { passport.authenticate('local-login', function(err, user, info) { if (err) { res.status(500).send(JSON.stringify({ 'msg': "Internal Server Error" })); } if (!user) { res.status(401).send(JSON.stringify({ 'msg': "Username or Password is incorrect" })); } if (user) { res.status(200).send(JSON.stringify({ 'msg': "Successfully logged in" })); } })(req, res, next); }); 

这个解决scheme唯一的问题是,你将不得不手动login和创build会议等等。

  • 可以提供一个可选的callback以允许应用程序覆盖处理authentication尝试的默认方式。 该callback具有以下签名,其中user将在成功的身份validation尝试中被设置为经过validation的用户,否则为false 。 一个可选的info参数将被传递,包含策略的validationcallback提供的附加细节。
 app.get('/protected', function(req, res, next) { passport.authenticate ('local',function(err, user, info) { if (err) { return next(err) } if (!user) { return res.redirect('/signin') } res. redirect('/account'); })(req, res, next); }); 

请注意,如果提供了callback,则应用程序有责任login用户,build立会话,然后执行所需的操作。