我对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)
答案 0 :(得分:4)
你的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
没有第二个参数作为回调。
相反,它返回true或false以允许重定向发生。
因此,如果登录成功,则authenticate调用将返回true,将调用下一个函数并发生res.redirect(successRedirect)
。
否则,failRedirect
将被发送给用户并将用户重定向到登录页面失败。
以下是我们的策略代码:
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);
非常不同。
必须在function(req,res,next){(passport.authentication)(req,res,next)}
内调用 app.get('path',method)
。在这种情况下,express.get调用提供了3个参数。因此,req,res,next
实际上可以执行示例中显示的方式。如果您从外面(passport.authentication)(req,res,next)
,则不会填充req,res,next
。你的代码会失败。