2016-03-02 66 views
1

我是新来的快递,我试图用护照实施一些身份验证方法。这对我来说似乎是最好的选择,我开始阅读几个教程,现在我有这个不寻常的代码。 显然策略registerStrategy未被使用,因为console.log(“log”);没有在服务器的控制台中显示。 节点没有发生错误。策略未被使用,为什么?

//localStrategy.js 
 

 
var registerStrategy = new localStrategy(
 
    function(req, res, done){ 
 
    console.log("log"); 
 
    var user = { 
 
     username: req.user.username, 
 
     password: req.user.password, 
 
     name: req.body.user.name, 
 
     lastname: req.body.user.lastname, 
 
     email: req.body.user.email, 
 
     event_time: req.body.user.event_time 
 
    }; 
 
    var usernameExists = true, emailExists = true; 
 
    var tasks = [ 
 
     function(cb){ 
 
     db.usernameExists(user.username, function(err, exists){ 
 
      if(err) return cb(err); 
 
      usernameExists = exists; 
 
      cb(); 
 
     }); 
 
     }, 
 
     function(cb){ 
 
     db.emailExists(user.email, function(err, exists){ 
 
      if(err) return cb(err); 
 
      emailExists = exists; 
 
      cb(); 
 
     }); 
 
     } 
 
    ]; 
 
    async.parallel(tasks, function(err){ 
 
     if(err) return done(err); 
 
     if(usernameExists || emailExists){ 
 
     return done(null, usernameExists, emailExists); 
 
     } 
 
     done(null, null, null); 
 
    }); 
 

 
    } 
 
); 
 
\t 
 
\t app.use(session(sessionData)); 
 
\t passport.use("local-register", registerStrategy); 
 

 
//routes.js 
 

 
app.post("/api/register", function(req, res){ 
 
    passport.authenticate("local-register")(req, res, 
 
              function(err, usernameExists, emailExists){ 
 
    if(err) throw err; 
 
    if(usernameExists){ 
 
     return res.status(401).json({ err: "User exists"}); 
 
    } 
 
    else if(emailExists){ 
 
     return res.status(401).json({ err: "Email exists"}); 
 
    } 
 
    res.status(200).json({status: "Succesful"}); 
 
    } 
 
); 
 
});

哪里是我的错?

+0

您是否检查过控制台错误?是否说localStrategy undefined?你有没有导入所需的文件。 –

+0

是的,我检查过,没有错误。我导入了所有需要的文件或库。你是否熟悉我称之为战略的方式?与**(“本地注册”)(...)**?认为这可能是问题 – Hernan

回答

0

passport.authenticate(...)是返回middleware函数的函数,所以第三个参数是对下一个函数的引用。在你的代码中匿名函数:

function(err, usernameExists, emailExists){ 
    if(err) throw err; 
    if(usernameExists){ 
     return res.status(401).json({ err: "User exists"}); 
    } 
    else if(emailExists){ 
     return res.status(401).json({ err: "Email exists"}); 
    } 
    res.status(200).json({status: "Succesful"}); 
}) 

应该是passport.authenticate功能作为callback内。是这样的:

app.post("/api/register", function(req, res){ 
    passport.authenticate("local-register", function(err, usernameExists, emailExists){ 
    if(err) throw err; 
    if(usernameExists){ 
     return res.status(401).json({ err: "User exists"}); 
    } 
    else if(emailExists){ 
     return res.status(401).json({ err: "Email exists"}); 
    } 
    res.status(200).json({status: "Succesful"}); 
    })(req, res); 
}); 

还要注意,匿名函数的第二个参数应该是由应用程序提供的对象已经给予机会来验证凭证(用户对象),第三个参数后是附加有关用户的信息。对于在LocalStrategy,代码以通过req对象,你需要指定选项{passReqToCallback : true}参数,之后,你将不得不在功能callback四个参数分别为:requsernamepassword和另一callback功能,通常命名为done,所以签名应该是这样的:

var registerStrategy = new localStrategy(
    {passReqToCallback : true}, 
    function(req, username, password, done){ 
     ... 
    } 
相关问题