gpt4 book ai didi

node.js - 策略没有被使用,为什么?

转载 作者:太空宇宙 更新时间:2023-11-04 02:15:58 25 4
gpt4 key购买 nike

我是 express 公司的新手,我正在尝试使用 Passport 实现一些身份验证方法。这对我来说似乎是最好的选择,我开始阅读几个教程,现在我有了这个不寻常的代码。显然,策略 registerStrategy 没有被使用,因为 console.log("log"); 没有显示在服务器的控制台中。 Node 没有抛出任何错误。

//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);
});

}
);

app.use(session(sessionData));
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"});
}
);
});

我的错误在哪里?

最佳答案

passport.authenticate(...) 是一个返回中间件 函数的函数,因此第三个参数是对下一个中间件 函数的引用。在您的代码中,匿名函数:

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函数内。像这样的事情:

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){
...
}

关于node.js - 策略没有被使用,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35741103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com