我正在使用节点并在他授权后尝试重定向客户端。出于这个原因,我在客户端使用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是从how to implement login auth in node.js获取的(而不是user_id我使用的是用户名;这不是问题所在。)
也许我不知道的是如何正确对待这个ajax调用。我打印一些控制台消息,服务器一直到res.send('如果你正在查看这个页面......'),但是,客户端没有任何反应。然后,当我按下control-C终止服务器时,会弹出警告窗口。同时,我可以看到传递成功的函数可以有参数(现在猜测:errorCode,errorString,otherData,或许更多)。
那么我做错了什么?
答案 0 :(得分:3)
这里的问题是,您在JavaScript驱动的导航和直接服务器请求 - 响应驱动的导航的概念之间有点混淆。让我们来看看这一点,看看它是否更有意义。
您正在使用ajax提交登录表单,这意味着您将保留在您所在的页面上,只需使用JavaScript提交您的http请求,即可收集回复。您放置POST
,服务器将用户登录,然后返回3XX
表示重定向。您的JavaScript会收集响应,如果您在“网络”标签下打开检查器,则可以看到该响应。但是这个页面并没有去任何地方,因为你只是用JavaScript收集你的回复。
在这种情况下,您要选择其中一个 - 使用JavaScript来处理您的路由(像backbone这样的工具在这样的情况下非常有用并且带有很好的路由类),或提交登录通常形成,而不是通过ajax。如果您在用户点击按钮时提交表单并且没有用JS捕获它,这应该可以解决问题 - 如果您从服务器返回重定向,页面将按预期重定向。或者,如果不是发送重定向响应,您可以发送回JSON指示成功或失败,然后使用JavaScript显示相应的视图,这也可以解决问题。
查看服务器端代码,我假设你在这里使用ajax的原因是为了设置授权头。我不知道为什么你需要这些,因为你隐藏了内部auth功能,但你可能会发现不使用ajax的问题是你不会在正常情况下默认拥有这些自定义设置头表格提交。有一些方法可以收集相同的信息并以相同的方式移动它(你可以设置标题,委托给其他方法,甚至发送来自快递的http请求),但是我需要更多关于你如何具体处理的细节登录以建议如何简化该部分:)