首页 > 解决方案 > 我的 express.js 和 passport.js 中间件都在工作并且正在被调用,但是页面没有重定向

问题描述

我目前正在开发一个节点/快递服务器,我决定使用本地护照和本地 MongoDB 服务器进行用户身份验证。我正在使用 html 表单中的 POST 方法来发送两个项目,一个电子邮件和一个密码(我在我的 LocalStrategy 实例中更改了 usernameField 项目)。使用console.log,我从Mongo 和Passport 中看到了所有正确和预期的行为。但是,页面永远不会使用 successRedirect 或 failureRedirect 重定向。看起来 html 页面 (Login.html) 刚刚刷新。有趣的是,根据我决定如何从表单发出 POST 请求,我会得到不同的行为。最初,我使用 jQuery 和 $('#id').submit() 方法在 '/students' 调用 $.post 请求,并观察到上述行为。然而,

注意:“学生”是我的猫鼬模型的名称,问题不在于那个

我已经尝试过的事情: 1. 对我的 passport.authenticate 使用自定义回调并使用 res.redirect。其实我在这个函数里面放了一个console.log,看看有没有被调用,确实是。但是 res.redirect 完全不起作用。2.摆脱我的自定义用户名字段和密码字段,只使用默认值。我观察到完全相同的行为。3. 使用 jQuery .click() 方法而不是 .submit() 方法。我认为提交表单与刷新页面有关,但这不起作用。

我认为可能有帮助但我不知道如何实现的事情: 1. 更改我所有服务器端 Javascript 的顺序(可能没有正确调用某些东西) 2. 我在某处看到使用了 passport.authorize 而不是护照。认证

在 app.js 中

app.use(passport.initialize());
app.use(passport.session());

passport.use(new LocalStrategy({
    usernameField: 'email',
    passwordField: 'password'
  },
(username, password, done) => {
    console.log(username, password);
    Student.findOne({ email: username, password:password }, function(err, user) {
        console.log(user); //this works as expected
        console.log(!user); //this works as expected
        if (err) { return done(err); }
        if (!user) {
          return done(null, false, { message: 'Incorrect username.' });
        }

        if (user.password != password) {
          return done(null, false, { message: 'Incorrect password.' });
        }

        return done(null, user);
      });
}));

passport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  Student.findById(id, function(err, user) {
    done(err, user);
  });
});

app.post('/students', passport.authenticate('local', { 
    successRedirect:'/public/Schedule.html',
    failureRedirect:'/' 
}));

在 Login.html 的 script 标签中

$('#loginForm').submit(() => {
    let currentUser = {
         email: $('#email').val(),
         password: $('#password').val()
    }

    checkForUser(currentUser);
});

function checkForUser(user) { 
    $.post('http://localhost:9000/students',user, (data) => { 
         console.log(data);
    })
}

标签: javascriptnode.jsexpresspassport.jspassport-local

解决方案


来自网页中 Javascript 的 Ajax 调用不会根据 http 响应自动重定向。自动重定向的事情是不是直接从 Javascript 调用服务器的事情,例如单击链接、提交表单(没有 Javascript)、在 URL 栏中键入 URL 等等......

相反,当从 Javascript 发送请求时(如您的那样),Javascript 会返回响应,并且该响应可用于您的 Javascript。如果您看到它是 302 并且您想要重定向,那么您将获取位置标头并设置window.location为该重定向 URL 以导致页面重定向。


推荐阅读