我的 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 以导致页面重定向。
我目前正在开发 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 以导致页面重定向。