javascript - NodeJS + Ajax + 登录表单

标签 javascript jquery node.js ajax authentication

我正在使用 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/

相关文章:

javascript - Svelte:未捕获的 ReferenceError:未定义导出

javascript - 从其他数据角色 ="page"重新加载第一个数据角色 ="page"

javascript - 声明原型(prototype)并在 NodeJS 中的同一文件中使用它

javascript - 避免在 HTML5 Canvas 中混合颜色

javascript - 获取表单元素的大小和位置

javascript - 在 JavaScript 中用同一帧中的另一个对象替换一个对象?

javascript - 缩放 svg 背景图像以适合容器

javascript - 向 Javascript 列表中的每个对象添加/删除属性的最简单方法?

node.js - Node.js 中如何处理 'read ETIMEDOUT'?

node.js - Node 8突然出现EADDRINUSE错误