如何在NodeJS / ExpressJS中正确redirect?

我在nodejs / expressjs中构build一个购物车应用程序。 我在用户login后redirect到正确的页面时遇到了一些问题。我发现了几篇紧密联系的文章,但是我所有的尝试从给定的文章中解决这些问题并没有起到什么作用。

access: function(req, res){ var data = JSON.parse(req.body.data); console.log(data); Customers.findOne({"custEmail": data.custEmail}, function(err, user){ if(err){ console.log(err); res.send("error"); }if(!user){ console.log("user not found"); res.send("error"); }else{ console.log("user found"); bcrypt.compare(data.custPassword, user.custPassword, function(err, reponse){ if(reponse){ req.session.regenerate(function(err){ if(err){ console.log(err); res.send("error"); }else{ req.session.success = true; res.send("Success"); //res.redirect('/'); } }); }else{ console.log("error"); } }); } }); 

会发生什么事是,用户input他们的login信息并单击loginbutton。 Ajax请求将数据发送到此访问函数。 该function首先检查用户是否存在于数据库中。 如果它比继续比较bcrypt密码,如果他们相等,他们成功login,如果他们不相等,那么显然它错误了。

这个问题似乎在这里: }else{ req.session.success = true; res.send("Success"); //res.redirect('/'); } }else{ req.session.success = true; res.send("Success"); //res.redirect('/'); }

当用户的电子邮件和密码匹配时,在这里点击。 它说..将此会话设置为true,以便用户可以访问需要此会话的页面,然后将成功消息发送回ajax请求。 这目前工作得很好,res.send发送到前端。 当我取消res.redirect的注释时,“设置后无法设置标题”的预期结果发生。 所以当我将res.send注释掉时,res.redirect根本就不能工作。 没有错误,没有任何东西只是没有打破。

我很好奇为什么在这里redirect不起作用? 在这个函数的其他地方没有设置头文件,预期的结果应该是redirect将工作得很好。 任何帮助是极大的赞赏。 谢谢。

当您发送ajax调用并获取响应时,浏览器根据该ajax响应,不会对浏览器中的当前页面执行任何操作。 所以,你是否发送redirect响应到ajax调用没关系。 浏览器不会改变浏览器中的当前页面,无论如何。 Ajax响应为您的Javascript生成数据,然后您的Javascript必须决定如何处理它。

仅供参考,浏览器将仅在浏览器页面请求或浏览器提交表单发送redirect(不提交Javascript)时更改当前页面。 由于这不是你如何login,你不能使用redirect来改变当前的浏览器页面。

因此,如果您要在客户端上使用ajax调用来login,并且希望客户端在成功loginAjax后更改页面,那么您可能希望在login响应中发送redirectURL,并让客户端处理它并设置window.location做loginredirect。

例如,你可以改变:

 res.send("Success"); 

对此:

 res.json({status: "Success", redirect: '/'}); 

然后,让你的客户端代码检查ajax调用的返回,如果状态成功,它可以获取redirect属性,并执行如下操作:

 if (ajaxResult.status === "Success") { window.location = ajaxResult.redirect; } 

我很好奇为什么在这里redirect不起作用? 在这个函数的其他地方没有设置头文件,预期的结果应该是redirect将工作得很好。 任何帮助是极大的赞赏。

关于标题的消息已经被发​​送意味着整个响应已经用res.send("Success"); 而你现在正在尝试发送另一个回应。 对于给定的请求,您只能得到一个响应。 一旦你完成res.send("Success"); ,http服务器对象发送了整个响应,然后closures了该响应。 你不能发送更多的数据。