我正在Node.js
用作 iPhone 客户端的后端 API 服务器。我正在Passport.js
使用local strategy
. 相关代码如下:
// This is in user.js, my user model
UserSchema.static('authenticate', function(username, password, callback) {
this.findOne({ username: username }, function(err, user) {
if (err){
console.log('findOne error occurred');
return callback(err);
}
if (!user){
return callback(null, false);
}
user.verifyPassword(password, function(err, passwordCorrect){
if (err){
console.log('verifyPassword error occurred');
return callback(err);
}
if (!passwordCorrect){
console.log('Wrong password');
return callback(err, false);
}
console.log('User Found, returning user');
return callback(null, user);
});
});
});
和
// This is in app.js
app.get('/loginfail', function(req, res){
res.json(403, {message: 'Invalid username/password'});
});
app.post('/login',
passport.authenticate('local', { failureRedirect: '/loginfail', failureFlash: false }),
function(req, res) {
res.redirect('/');
});
现在,我设法将失败的登录重定向到 /loginfail,在那里我将一些 JSON 发送回 iPhone 客户端。但是,这没有足够的粒度。我希望能够将适当的错误发送回 iPhone 客户端,例如:“未找到用户”或“密码错误”。使用我现有的代码,我看不出这是如何实现的。
我尝试在 passport.js 网站上按照示例进行自定义回调,但由于缺乏对节点的理解,我无法让它工作。我怎样才能修改我的代码,以便能够发回带有适当错误代码/消息的 res.json?
我现在正在尝试这样的事情:
// In app.js
app.post('/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err) { return next(err) }
if (!user) {
console.log(info);
// *** Display message without using flash option
// re-render the login form with a message
return res.redirect('/login');
}
console.log('got user');
return res.json(200, {user_id: user._id});
})(req, res, next);
});
// In user.js
UserSchema.static('authenticate', function(username, password, callback) {
this.findOne({ username: username }, function(err, user) {
if (err){
console.log('findOne error occurred');
return callback(err);
}
if (!user){
return callback(null, false);
}
user.verifyPassword(password, function(err, passwordCorrect){
if (err){
return callback(err);
}
if (!passwordCorrect){
return callback(err, false, {message: 'bad password'});
}
console.log('User Found, returning user');
return callback(null, user);
});
});
});
但是当我尝试 console.log(info) 时,它只是说未定义。我不知道如何让这个自定义回调工作......任何帮助将不胜感激!