Node.js Express+;护照可以';不要读闪信

Node.js Express+;护照可以';不要读闪信,node.js,typescript,express,flash,passport.js,Node.js,Typescript,Express,Flash,Passport.js,我有我的Express+Passport+Firebase项目,在那里我通过本地策略处理身份验证。因为我发现Passport将负责身份验证过程,所以我还发现它将接受flash消息作为done()函数(在策略中)的第三个参数。但我不知道怎么读: 我猜我设置和阅读flash消息的流程是: 使用NPM安装 导入Express中间件后设置它: 从“连接闪存”导入*为闪存; ... 常量app=express(); ... 应用程序使用(flash()); 根据以下内容在快速路线中配置Passport身

我有我的Express+Passport+Firebase项目,在那里我通过本地策略处理身份验证。因为我发现Passport将负责身份验证过程,所以我还发现它将接受flash消息作为
done()
函数(在策略中)的第三个参数。但我不知道怎么读:

我猜我设置和阅读flash消息的流程是:

  • 使用NPM安装

  • 导入Express中间件后设置它:

  • 从“连接闪存”导入*为闪存;
    ...
    常量app=express();
    ...
    应用程序使用(flash());
    
  • 根据以下内容在快速路线中配置Passport身份验证:
  • //POST-/api/v1/admin/oauth/login
    转发器(
    “/login”,
    async(req:Request,res:Response)=>{/*验证输入的中间件函数*/},
    passport.authenticate('local'{
    failureRedirect:“/api/v1/admin/oauth/login”,
    failureFlash:正确
    }),
    异步(req:Request,res:Response)=>{/*成功登录后的函数*/
    );
    
  • 根据以下说明,在
    done()
    方法中包括闪存消息:
  • 从“passport local”导入{Strategy as LocalStrategy};
    从“../../config/database”导入数据库;
    从“bcryptjs”导入*作为bcrypt;
    导出默认的新LocalStrategy({usernameField:'email'},异步(电子邮件,密码,完成)=>{
    const ref=db.collection(“用户”).doc(电子邮件);
    试一试{
    const doc=wait ref.get();
    如果(!doc.存在){
    返回完成(null,false,{error:'error email'});
    }
    const user=doc.data();
    const match:boolean=wait bcrypt.compare(密码,user.password);
    如果(!匹配){
    返回完成(null,false,{error:'错误密码'});
    }
    user.id=doc.id;
    删除用户密码;
    返回完成(空,用户);
    }捕获(错误){
    返回完成(错误);
    }
    });
    
  • 使用
    req.flash('error')
    读取闪存消息:
  • //GET-/api/v1/admin/oauth/login
    router.get('/login',(请求:任意,请求:响应)=>{
    常量结果:IResult={
    消息:“”,
    数据:空,
    好:错
    };
    如果(请求闪存(“错误”)){
    resultado.message=req.flash('error');
    控制台日志(请求闪存(“错误”);
    }
    返回res.status(400).json(结果);
    });
    

    我以为它在理论上在我脑海中运行,直到第5步,
    req.flash('error')
    中有一个空数组。我做错了什么?

    你传递的flash消息错了

    done()
    的第三个参数应该是一个包含
    type
    message
    字段的对象:

    return done(null, false, { message: 'Wrong email' });
    
    该类型默认为
    error

    此API似乎没有明确的文档记录,但在Passport.js文档的“配置”一章中显示


    我创建了一个可重复性最低的工作示例。

    我一直在搜索,找到了一个解决方案,但在第二次登录尝试中它仍然有效

    我修改了问题中的步骤以使其生效:
  • 使用NPM安装

  • 导入Express中间件后设置它:

  • 从“连接闪存”导入*为闪存;
    ...
    常量app=express();
    ...
    应用程序使用(flash());
    
  • 根据以下内容在快速路线中配置Passport身份验证:
  • //POST-/api/v1/admin/oauth/login
    转发器(
    “/login”,
    async(req:Request,res:Response)=>{/*验证输入的中间件函数*/},
    passport.authenticate('local',{
    failureFlash:没错,
    failureRedirect:“/api/v1/admin/oauth/login”
    }),
    异步(req:Request,res:Response)=>{/*成功登录后的函数*/
    );
    
  • 由于@Codebling:
  • //GET-/api/v1/admin/oauth/login
    路由器.get('/login',(请求:请求,回复:响应)=>{
    常量结果:IResult={
    消息:“Auth ok”,
    数据:空,
    好的,没错
    };
    let状态:编号=200;
    const flashMessage:any=req.flash('error');
    if(flashMessage.length){
    resultado.message=flashMessage[0];
    resultado.ok=false;
    状态=400;
    }
    返回res.status(status).json(result);
    });
    
  • 根据以下说明,在
    done()
    方法中包括闪存消息:
  • 从“passport local”导入{Strategy as LocalStrategy};
    从“../../config/database”导入数据库;
    从“bcryptjs”导入*作为bcrypt;
    导出默认的新LocalStrategy({usernameField:'email'},异步(电子邮件,密码,完成)=>{
    const ref=db.collection(“用户”).doc(电子邮件);
    试一试{
    const doc=wait ref.get();
    如果(!doc.存在){
    返回完成(null,false,{message:'error email'});
    }
    const user=doc.data();
    const match:boolean=wait bcrypt.compare(密码,user.password);
    如果(!匹配){
    返回完成(null,false,{消息:“错误的密码”});
    }
    user.id=doc.id;
    删除用户密码;
    返回完成(空,用户);
    }捕获(错误){
    返回完成(错误);
    }
    });
    
    Flash消息仅在请求的生命周期内可用。向
    /login
    发出
    HTTP-POST
    请求将获得使用授权,并闪烁一条消息,该消息可以响应
    HTTP-POST
    请求而适当呈现。
    HTTP-GET
    请求是一个单独的请求,不会检索请求另一个
    HTTP POST
    请求中的闪存消息。@OLUWAFEMIULE不正确。闪存消息存储在会话中,可在后续请求中使用。这是闪存消息的记录行为。文档一定是错误的。@OLUWAFEMIULE source?文档读取“使用闪存消息需要req.fl