护照无法成功重定向

问题描述

我从关于护照的 odin 项目中学习了一个教程,它奏效了,所以我决定实施我在自己的项目中学到的东西,他们和我的不同之处在于我遵循了一种设计模式,而他们没有,而我似乎无法找到为什么它没有响应的问题。 在我的登录页面中,我使用了电子邮件密码,并且多次尝试更改以下代码

这是控制器.js

    //passport functions
passport.use(
  new LocalStrategy((username,password,done) => {
    User.findOne({ username: username },(err,user) => {
      console.log(user)
      
      if (err) { 
        return done(err);
      };
      if (!user) {
        return done(null,false,{ msg: "Incorrect username" });
      }
      if (user.password !== password) {
        return done(null,{ msg: "Incorrect password" });
      }
      return done(null,user);
    });
  })
);
passport.serializeUser(function(user,done) {
  done(null,user.id);
});

passport.deserializeUser(function(id,done) {
  User.findById(id,function(err,user) {
    done(err,user);
  });
});
//end ofpassport functions

    app.use(session({ secret: "cats",resave: false,saveUninitialized: true }));
    app.use(passport.initialize());
    app.use(passport.session());
    app.use(express.urlencoded({ extended: false }));
    app.use(function(req,res,next) {
      res.locals.currentUser = req.user;
      next();
    });

然后我从 routes.js 调用控制器以对用户进行身份验证,但它一直失败并认失败重定向

app.post('/signin',passport.authenticate("local",{
    successRedirect:"/",failureRedirect:'/signup'}))

解决方法

默认情况下,LocalStrategy 希望在名为 username 和 password 的参数中找到凭据。如果您的站点更喜欢以不同方式命名这些字段,则可以使用选项来更改默认值。

req.body 中的参数名称应与自定义字段匹配,并且当存在空字段 usernameFieldpasswordField 时不调用 LocalStrategy

const customFields = {
    usernameField : "email",passwordField : "password"
}

passport.use(
  new LocalStrategy(customFields,(username,password,done) => {
    User.findOne({ username: username },(err,user) => {
      console.log(user)
      
      if (err) { 
        return done(err);
      };
      if (!user) {
        return done(null,false,{ msg: "Incorrect username" });
      }
      if (user.password !== password) {
        return done(null,{ msg: "Incorrect password" });
      }
      return done(null,user);
    });
  })
);
passport.serializeUser(function(user,done) {
  done(null,user.id);
});

passport.deserializeUser(function(id,done) {
  User.findById(id,function(err,user) {
    done(err,user);
  });
});
//end ofpassport functions

    app.use(session({ secret: "cats",resave: false,saveUninitialized: true }));
    app.use(passport.initialize());
    app.use(passport.session());
    app.use(express.urlencoded({ extended: false }));
    app.use(function(req,res,next) {
      res.locals.currentUser = req.user;
      next();
    });