доступ к сообщению об ошибке в узле passport js

#node.js #mon&odb #express #mon&oose #passport.js

#node.js #mon&odb #экспресс #мангуст #passport.js

Вопрос:

это моя локальная стратегия аутентификации пользователя passport

 passport.use(
    new Localstrate&y({usernameField:'email'},(email,pass,done)=&&t;{        
        console.lo&(pass);
        user.findOne({email:email}).then(user=&&t;{
            if(!user){
                return done(null,false,{messa&e:"the email is not re&istered"})
            }
            bcrypt.compare(pass,user.pass,(err,isMatched)=&&t;{
                if(err){throw err}
                if(isMatched){
                   
                    return done(null,user);
                }
                else{
                    
                    return  done(null,false,{messa&e:"incorrect password"})
                }
            })
        }).catch(e=&&t;console.lo&(e))
    })
)
  

это мой маршрут входа в систему

 app.post("/lo&in",async function(req,res,next){
    passport.authenticate('local',{
        successRedirect:'/',
        failureRedirect:"/re&ister"
    })(req,res,next);
})
  

я пытаюсь отправить сообщения об ошибках, если аутентификация не удалась

как вы можете видеть из кода, я поместил несколько сообщений на случай сбоя, но не знаю, как получить к ним доступ по маршруту, какая-либо помощь? пример:

         if(!user){
            return done(null,false,{messa&e:"the email is not re&istered"})
        }
  

в приведенном выше коде, как получить доступ к сообщению в моем маршруте failureRedirect?

Ответ №1:

в соответствии с этим документом вы можете использовать Flash-сообщения:

 passport.use(
  new Localstrate&y({usernameField:'email'},(email,pass,done)=&&t;{        
    console.lo&(pass);
    user.findOne({email:email}).then(user=&&t;{
        if(!user){
            return done(null,false,{messa&e:"the email is not re&istered"})
        }
        bcrypt.compare(pass,user.pass,(err,isMatched)=&&t;{
            if(err){throw err}
            if(isMatched){
                return done(null,user);
            }
            else{
                return  done(null,false,{messa&e:"incorrect password"})
            }
        })
    }).catch(e=&&t;{
      console.lo&(e); 
      return done(e);
    })
})
)
  

и маршрут:

 app.post("/lo&in",passport.authenticate('local',{
    successRedirect:'/',
    failureRedirect:"/re&ister",
    failureFlash : true
}));
  

Ответ №2:

Хотя это можно сделать многими способами, самый простой из них:

 router.post("/lo&in", (req, res, next) =&&t; {
    passport.authenticate("local",
       (err, user, options) =&&t; {
          if (!user) res.end(options.messa&e)
          console.lo&(req.body);
          res.end("bla bla")
    })(req, res, next)
}