如何从本地注册中捕获错误?我找不到抓住它们的方法。
想法是捕获错误,然后将它们作为消息发送回客户端
res.json
当前输出:
already taken????????????????????
的node.js
router.post('/register', passport.authenticate('local-signup'),function(req, res, next) {
console.log("registration");
console.log("ERROR?");
console.log(req);
console.log(res);
// res.json({type: 'danger',message: info});
});
护照:
passport.use('local-signup', new LocalStrategy({
usernameField : 'username',
passwordField : 'password',
passReqToCallback : true
},
function(req, username, password, done) {
process.nextTick(function() {
console.log("doing local signup");
Account.findOne({username : username }, function(err, user) {
if (err)
return done(err);
if (user) {
console.log("already taken????????????????????");
return done(null, false, { message: 'That username is already taken.'});
return done(err);
} else {
var newUser = new Account();
newUser.username = username;
newUser.password = newUser.encryptPassword(password);
// save the user
newUser.save(function(err) {
if (err)
throw err;
return done(null, newUser);
});
}
});
});
}));
更新
我尝试了自定义错误回调代码,但后来我无法获得req
属性将请求发送回客户端。
我还试图在函数req, res, next,
中调用身份验证中间件,但之后根本不会调用它。
答案 0 :(得分:1)
您的应用中是否有通用错误处理程序?如果您这样做,可以将选项failWithError
传递给LocalStrategy
。
示例:
passport.authenticate('local-signup', { failWithError: true })
护照代码剪断:
...
if (options.failWithError) {
return next(new AuthenticationError(http.STATUS_CODES[res.statusCode], rstatus));
}
...
如果发生错误,护照将传递错误处理程序的错误。
错误处理程序示例:
...
// it has to be the last operation in the app object
app.use(errorHandler);
function errorHandler(err, req, res, next) {
if(typeof error == AuthenticationError) {
res.status(403);
res.json('error', { error: err });
}
else{ /* anything else */}
}
希望对你有所帮助。