【问题标题】:How to properly redirect in NodeJS/ExpressJS?如何在 NodeJS/ExpressJS 中正确重定向?
【发布时间】:2017-04-26 00:11:17
【问题描述】:

我正在 nodejs/expressjs 中构建一个购物车应用程序。在用户登录后,我在重定向到正确的页面时遇到了一些问题。我发现了几篇密切相关的文章,但我从这些给定文章中修复它的所有尝试都没有成功。

    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");
            }
          });
          }
      });

发生的情况是,用户输入他们的登录信息并单击登录按钮。 Ajax 请求将数据发送到此访问函数。该函数首先检查用户是否存在于数据库中。如果确实如此,它将继续比较 bcrypt 密码,如果它们相等,则成功登录,如果它们不相等,则显然会出错。

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

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

我很好奇为什么这里的重定向不起作用?标头未在此函数的其他任何地方设置,预期结果应该是重定向可以正常工作。任何帮助是极大的赞赏。谢谢。

【问题讨论】:

    标签: ajax node.js express redirect


    【解决方案1】:

    当您使用XMLHttpRequestfetch() 发送ajax 调用并获得响应时,浏览器不会根据该响应对浏览器中的当前页面执行任何操作。因此,是否向 ajax 调用发送重定向响应并不重要。无论如何,浏览器都不会更改浏览器中的当前页面。 Ajax 响应为您的 Javascript 生成数据,然后您的 Javascript 必须决定如何处理它。

    仅供参考,仅当从浏览器页面请求或浏览器提交的表单帖子(不是 Javascript 提交)发生重定向时,浏览器才会更改当前页面。因为这不是您登录的方式,您不能使用重定向来更改当前浏览器页面。

    因此,如果您要在客户端上使用 ajax 调用进行登录,并且希望客户端在 Ajax 登录成功后更改页面,那么您可能希望在登录响应中发送重定向 URL 并拥有客户端处理它并设置window.location在登录时进行重定向。

    例如,您可以更改:

    res.send("Success");
    

    到这里:

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

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

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

    我很好奇为什么这里的重定向不起作用?标题是 未在此函数中的其他任何地方设置和预期结果 应该是重定向可以正常工作。任何帮助都是 非常感谢。

    关于 headers 的消息已经发送意味着整个响应已经用res.send("Success"); 发送了,你现在正试图发送另一个响应。对于给定的请求,您只会得到一个响应。完成res.send("Success"); 后,http 服务器对象已发送整个响应,然后关闭该响应。此时您无法发送更多数据。

    【讨论】:

    • 嘿,谢谢。您的第一个初始响应对我来说已经足够了。我最终只是删除了 Ajax 请求,因为它不是 100% 必要的。我只是喜欢 Ajax 的工作方式,所以想在这里使用它。相反,我取出了 Ajax,然后从表单提交页面中抓取了 req.body.data。然后就像在此处放置正确的重定向一样简单。感谢您及时且非常有帮助的回答!
    • 我不想更改或删除您的回复中的任何内容.. 如果您想加粗此声明:重定向通常不适用于 ajax 调用,因为浏览器不会在 ajax 调用上处理它们(浏览器在页面加载或表单发布响应时处理重定向)。在你的回应中,这将是非常好的。这句话本身帮助我决定在这种特定情况下不使用 Ajax。
    • 你也看看这篇文章好吗? link
    【解决方案2】:

    我在其他地方问一个问题,stackoverflow 将我带到这里。

    为什么res.redirect()不能在res.render()之后

    只是为了让人们碰到和我一样的问题,我在这里做了一个总结。 在res.render() 之后,响应结束。而res.redirect()会将Header设置为Location中的新url,这个url我们已经发送给客户端了,不能再设置了。

    我的解决方案是在客户端 location.href ="/" 中编码,如果该页面在 html 标记中接收到类似 redirectAttribute = true 的变量。

    【讨论】:

      猜你喜欢
      • 2013-07-31
      • 2020-06-27
      • 2016-12-20
      • 1970-01-01
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      • 2017-12-13
      相关资源
      最近更新 更多