我的 express.js 和 passport.js 中间件都在工作并被调用,但页面没有重定向

My express.js and passport.js middleware are all working and are being called, but the page does not redirect

我目前正在开发 node/express 服务器,我决定使用 passport-local 和本地 MongoDB 服务器进行用户身份验证。我正在使用 html 表单中的 POST 方法来发送两个项目,一个电子邮件和一个密码(我在我的 LocalStrategy 实例中更改了 usernameField 项目)。使用 console.log,我已经从 Mongo 和 Passport 中看到了所有正确和预期的行为。但是,该页面永远不会使用 successRedirect 或 failureRedirect 进行重定向。看起来 html 页面 (Login.html) 刚刚刷新。有趣的是,根据我决定如何从表单发出 POST 请求,我会得到不同的行为。最初,我使用 jQuery 和 $('#id').submit() 方法在 '/students' 调用 $.post 请求,我观察到上述行为。但是,当我摆脱这个脚本并用于发送请求时,中间件的 none 被调用(再次,我使用 console.log 确认了这一点),页面立即重定向到我的 failureRedirect url,无论我是否在表格中输入了有效数据。

注意:'Student' 是我的猫鼬模型的名称,问题不在于此

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

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

在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

的脚本标签中
$('#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);
    })
}

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

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