Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Express重定向应用程序后调用反序列化用户_Javascript_Node.js_Express_Deserialization_Passport.js - Fatal编程技术网

Javascript 在Express重定向应用程序后调用反序列化用户

Javascript 在Express重定向应用程序后调用反序列化用户,javascript,node.js,express,deserialization,passport.js,Javascript,Node.js,Express,Deserialization,Passport.js,这个网站上有很多关于Passport.js函数反序列化用户从未被调用的问题。我的问题有点有趣-在我的应用程序中,函数在我的应用程序重定向后被调用。我在下面提供了我的登录代码流,按照我理解调用各种函数的顺序。我也会尽量避免任何不必要的细节 在我的应用程序中,Passport.js配置了LocalStrategy //配置passport.js passport.use(新本地策略)(用户名、密码、完成)=>{ log(“在Passport的本地策略回调中…”); //在数据库中搜索用户 db.qu

这个网站上有很多关于
Passport.js
函数
反序列化用户
从未被调用的问题。我的问题有点有趣-在我的应用程序中,函数在我的应用程序重定向后被调用。我在下面提供了我的登录代码流,按照我理解调用各种函数的顺序。我也会尽量避免任何不必要的细节

在我的应用程序中,
Passport.js
配置了
LocalStrategy

//配置passport.js
passport.use(新本地策略)(用户名、密码、完成)=>{
log(“在Passport的本地策略回调中…”);
//在数据库中搜索用户
db.query(“从用户中选择*”,异步(错误、结果、字段)=>{
if(err){//处理错误,抽象掉}
否则{
//在数据库中搜索用户
for(设i=0;i
序列化用户
反序列化用户
的构造如下。似乎没有在正确的时间调用
反序列化用户
请特别注意
console.log()
函数顶部的
语句。

passport.user((用户,完成)=>{
log(“序列化用户”+user.username+“并将其ID存储到会话文件存储…”);
返回完成(null,user.id);
});
passport.deserializeUser((id,done)=>{
log(“试图反序列化ID为“+ID+”的用户”);
db.query(“从用户中选择*”,异步(错误、结果、字段)=>{
if(err){//处理数据库错误,抽象掉}
否则{
for(设i=0;i
我网站上的登录表单包含用户名和密码字段。以下是处理此页面的
GET
ting的路径

app.get('/login',(req,res)=>{
日志(“下面的Flash消息”);
控制台日志(请求会话闪存);
if(req.isAuthenticated())res.redirect('/');
否则{
log(“在“+now()+”上请求的登录路由”);
res.render('login.html');
}
});
登录表单将发布到此处理程序:

app.post('/login',passport.authenticate('local'),
{
successRedirect:“/profile”,
successFlash:“成功登录!”,
failureRedirect:“/login#main content”,
failureFlash:“登录失败。”
}
));
/profile
路由的路由处理程序如下所示

app.get('/profile',(req,res)=>{
if(req.isAuthenticated()){//加载配置文件页,抽象掉}
否则{
console.log(请求用户?\n请求用户:“+req.user:”\n配置文件请求未通过身份验证!”)
req.flash('访问',“您需要登录才能访问您的个人资料!”);
res.redirect('/login');
}
});
最后,这里是我的应用程序主页的处理程序

app.get('/',(req,res)=>{
log(“\n在“+now()+”…”上请求的主页);
log(req.isAuthenticated()?“登录主页请求”。:“注销主页请求”);
控制台日志(请求用户);
log(“请求会话ID:+req.sessionID+”\n”);
res.render('index.html');
});
观察上面代码中的
console.log()
片段。下面是从用户将登录表单发布到我的网站开始的输出。(请原谅,颜色太糟糕了,这是从一个Docker集装箱里弄来的!)

根据控制台输出,功能流程如下所示:

  • 表单被发布到登录
    POST
    路径,该路径调用
    passport.authenticate()
  • passport.authenticate()
    然后调用
    LocalStrategy
    回调,它在数据库中搜索用户。在这里,搜索成功,找到了用户
  • 然后调用
    serializeUser
    ,然后,应用程序在调用
    反序列化user
    函数(再次成功)之前重定向到配置文件页面
  • 在配置文件页面上,请求未经验证(因为配置文件是在反序列化发生之前请求的),因此我们重定向到登录页面
  • 在登录页面中,已存储成功登录的闪存消息,这表明登录失败
    main_website | Inside Passport's Local Strategy callback...
    main_website | Username and password match for user2!
    main_website | Serializing the user user2 and storing their ID to the session file storage...
    main_website | 
    main_website | Request for profile is not authenticated!
    main_website | Attempting to deserialize user with ID 2...
    main_website | Deserialization was a success. User user2 has been found.
    main_website | Flash messages below.
    main_website | { success: [ 'Logged in successfully!' ] }
    main_website | 
    main_website | Home page requested on 2/11/2020, 00:22:58...
    main_website | Logged-out request for homepage.
    main_website | undefined
    main_website | Requesting session ID: 85a5fd86-57a2-4957-a1e0-dc6cde6a501b