0

我正在使用节点并在他授权后尝试重定向客户端。出于这个原因,我在客户端使用了使用 ajax 的 POST 方法,该方法具有以下形式:

$.ajax({
    type: "POST",
    url: '/login',
    dataType: "json",
    async: false,
    beforeSend: function(xhr) {
        xhr.setRequestHeader("Authorization", "Basic " + btoa(credentials.username + ":" + credentials.password));
    },
    data: credentials,
    success: function () {
        window.alert("Success! (whatever that means)");
    }
});

然后在服务器端,我尝试使用命令重定向到实际页面

app.get('/login', loginInternalApp);
app.post('/login', function (req, res){
    var postContents = req.body;
    req.session.username = postContents.username;
    res.redirect('/my_secret_page');
});
app.get('/my_secret_page', checkAuth, function (req, res) {
    console.log("sending the message!");
    res.send('if you are viewing this page it means you are logged in');
    res.end();
});

其中 checkAuth 取自 here how to implement login auth in node.js(而不是 user_id 我使用的是用户名;这不是问题)。

也许我不知道如何正确处理这个 ajax 调用。我打印了一些控制台消息,服务器一直到 res.send('如果您正在查看此页面...') 但是,客户端上没有任何反应。然后,当我按下 control-C 来终止服务器时,会弹出警报窗口。同时,我可以看到成功传递的函数可以有参数(现在猜测:errorCode、errorString、otherData,也许更多)。

那么我做错了什么?

4

1 回答 1

3

这里的问题是您对 JavaScript 驱动的导航和直接服务器请求响应驱动的导航的概念有点混淆。让我们来看看它是否更有意义。

您正在使用 ajax 提交登录表单,这意味着您停留在您所在的页面上,只需使用 JavaScript 提交您的 http 请求,收集响应。您放置POST,并且您的服务器将用户登录,然后返回一个3XX指示重定向。您的 JavaScript 收集响应,如果您在“网络”选项卡下打开检查器,您可以看到响应。但是该页面不会去任何地方,因为您只是使用 JavaScript 收集您的响应。

在这种情况下,您想选择其中一种——使用 JavaScript 来处理您的路由(像骨干网这样的工具在这种情况下非常有用,并且带有很好的路由类),或者正常提交登录表单,而不是通过 ajax。如果您在用户点击按钮时让表单提交并且不使用 JS 捕获它,这应该可以解决问题 - 如果您从服务器返回重定向,则页面将按预期重定向。或者,如果不是发送重定向响应,您可以发回指示成功或失败的 JSON,然后使用 JavaScript 显示适当的视图,这也可以解决问题。

查看您的服务器端代码,我假设您在这里使用 ajax 的原因是为了设置授权标头。我不确定您为什么需要这些,因为您隐藏了内部身份验证功能,但您可能会看到使用 ajax 的问题,即在普通表单提交中默认情况下不会有这些自定义设置标题。当然有方法可以收集相同的信息并以相同的方式移动它(您可以设置标头,委托给其他方法,甚至从 express 发送 http 请求),但我需要更多关于您如何具体处理的详细信息登录以建议如何简化该部分:)

于 2013-10-24T15:21:39.753 回答