当前位置: 首页 > 面试题库 >

如何在NodeJS / ExpressJS中正确重定向?

乐正峰
2023-03-14
问题内容

我正在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调用并获得响应时,浏览器不会基于该ajax响应对浏览器中的当前页面执行任何操作。因此,是否向ajax调用发送重定向响应都没有关系。无论如何,浏览器都不会更改浏览器中的当前页面。Ajax响应会为您的Javascript生成数据,然后您的Javascript必须决定如何处理它。

仅供参考,仅当重定向是根据浏览器页面请求或浏览器提交的表单发布(而不是Javascript提交)发生时,浏览器才会更改当前页面。
由于这不是您的登录方式,因此无法使用重定向更改当前浏览器页面。

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

例如,您可以更改:

res.send("Success");

对此:

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

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

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

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

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



 类似资料:
  • 我正在使用带区签出自定义集成-https://Stripe.com/docs/Checkout#integration-custom-,方法如下: 使用custom而不是simple-如何修改带区签出以发送AJAX请求?-因为simple不允许我进行AJAX调用。 https://stripe.com/docs/tutorials/charges 搜索-12的结果,没有太大帮助。

  • 我有多条带有评论的路线,当我单击“回复”时,我会被重定向到一条路线,在那里我可以发布对评论的回复。我如何正确地存储来自我所在地的路线,然后在发布回复后重定向回该路线? 我考虑将URL::previous作为参数传递,并将其存储到隐藏的输入中,但如果用户刷新页面,它将变为空。另一种方法可能是存储在会话中,但我不知道如何可靠地使其过期。。。

  • 问题内容: 我正在使用express在node.js中制作一个Web应用程序。这是我所拥有的简化: 我的问题如下: 如果发现发送的数据无效,我想向页面传递一些其他上下文。我该怎么办?重定向似乎不允许任何额外的参数。 问题答案: 有几种方法可以将数据传递到不同的路由。当然,最正确的答案是查询字符串。您需要确保值正确地是encodeURIComponent和encodeURIComponent。 您可

  • 听起来有点愚蠢,但我需要我的方法的帮助,这很烦人。我试着在网上查找,因为是一个出错和“找不到Kid constructor#2”的程序,尽管它在那里,我甚至会做其他事情,但它不起作用。好吧,这太多了,下面是我的代码: 好的,所以我上面的toString(我知道,我的第三个参数是关闭的,应该是字符串)是关闭的。如果我硬编码第三个值,它就会失控,说它找不到这个(上面)。那么我怎么才能得到日期并把它分开

  • 问题内容: 我曾就同一问题经历过许多问题,但各种解决方案都无济于事。我正在使用Redis将会话存储在群集的NodeJS + ExpressJS应用程序中,但是该会话始终是未定义的。这是我的Express设置: 即使不使用Redis存储,我也会收到以下错误: 问题答案: 您必须在路由之前实例化会话。

  • 我正在尝试使用google api for php登录,然后将用户重定向到dashboard.php,但是在重定向我的文件时突然出现了这个错误:这个回调文件负责标记并重定向到dashboard.php 包含设置的gog.php(我删除了这些值) 索引php,它检验用户是否使用google帐户或电子邮件pwd登录 包含的config.php文件具有要连接的数据库设置 最后是dashbaord.php