Passport发送错误的回调以能够res.json

时间:2017-05-16 09:47:49

标签: node.js passport-local passport.js

如何从本地注册中捕获错误?我找不到抓住它们的方法。

想法是捕获错误,然后将它们作为消息发送回客户端

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,中调用身份验证中间件,但之后根本不会调用它。

1 个答案:

答案 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 */}
}

希望对你有所帮助。