我正在使用 NodeJS 进行 AJAX 登录。这是我当前的代码:
routes.js:
app.post('/login', (req, res, next) => {
passport.authenticate('local-login', (err, user, info) => {
if (err)
return next(err);
if (!user)
return res.json({type: 'error', response: info});
req.logIn(user, (err) => {
if (err)
return next(err);
//return res.json({type: 'success', response: user});
return res.redirect(req.originalUrl);
//return res.redirect(req.get('referer'));
});
})(req, res, next);
});
自定义.js
let login = () => {
$.post( "/login", { email: $('#inputUsername').val(), password: $('#inputPassword').val() })
.done((data) => {
if(data.type === 'error'){
$( "#logFormError" ).html('<b>Error:</b> ' + (data.response.message ? data.response.message : data.response));
if(!$("#logFormError").is(":visible"))
$( "#logFormError" ).toggle();
}else{
if($("#logFormError").is(":visible"))
$( "#logFormError" ).toggle();
}
})
.fail((error) => {
$( "#logFormError" ).html('<b>Error:</b> ' + error);
if(!$("#logFormError").is(":visible"))
$( "#logFormError" ).toggle();
})}
replaysController.js(我现在显示登录表单的页面):
res.render('../views/pages/replays', {replay: replay, user: req.user});
我想要实现的是让我当前所在的页面包含新的登录信息。我不想使用客户端 JavaScript 来处理页面的不同项目,因为页面可能完全不同(主页、重播、商店、论坛...),因此元素不一样并且不通用。
如您所见,我已经在测试 res.redirect(req.get('referer'));和其他,但页面不会重定向,它只是发出请求并停留在那里。
我做错了什么?
最佳答案
res.redirect()
不会重定向浏览器页面,只会重定向 AJAX 请求。您可以通过使用浏览器中检查工具的网络选项卡查看初始 AJAX 请求以及初始请求的 301 响应之后的后续 AJAX 请求来验证这一点。
我想您不希望 AJAX 请求被重定向,您希望用户的浏览器被重定向。如果登录成功,我建议您回复一个包含成功状态指示符和要重定向到的 URL 的 JSON blob。然后,您可以在前端使用 javascript 通过设置 window.location.href
将用户的浏览器重定向到从 AJAX 端点返回的位置。
关于javascript - NodeJS + Ajax + 登录表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43472067/