【问题标题】:XMLHttpRequest does not reload pageXMLHttpRequest 不重新加载页面
【发布时间】:2018-06-18 11:59:01
【问题描述】:
firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    console.log("Signed in");
    return user.getIdToken(true).then(function(idToken) {
        // Send token to your backend via HTTPS
        // ...
        console.log("Token = " + idToken);
        var bearer = "Bearer " + idToken;
        var xhr = new XMLHttpRequest();
        xhr.open("GET", "dashboard");
        xhr.setRequestHeader("Authorization", bearer);
        return xhr.send();
    }).catch(function(error) {
        // Handle error
        console.log(error);
    });
  }
  else{
    console.log("User signed out");
  }
});

我正在执行以下请求。在我的服务器中,我收到日志说它已收到请求并且已将其识别为经过身份验证的用户等等。事实上,为了进行测试,我将它发送到一个简单的端点,例如 /hello,我只是在我的 express 应用程序中执行 res.render("Hello World!"),但即便如此,页面上也没有任何反应。为什么浏览器不刷新页面来表示来自端点的响应?

【问题讨论】:

    标签: javascript firebase xmlhttprequest firebase-authentication


    【解决方案1】:

    为什么浏览器不刷新页面来表示来自端点的响应?

    因为 Ajax 的整个 点是响应被传递给 JavaScript,因此您可以用它做自己喜欢的事情,而不是加载一个全新的页面。

    您可以通过以下方式访问数据:

    xhr.addEventListener("load", function () {
        console.log(this.responseText);
    });
    

    【讨论】:

    • 但是我想加载一个新的网页,即当他按下登录按钮时将用户重定向到/dashboard 端点。我尝试使用带有action="/dashboard" method="post" 的表单,但在服务器上设置授权标头时没有运气(stackoverflow.com/questions/50900309/…
    【解决方案2】:

    您现在构建的本质上是一个与来自 JS 的 API 进行通信的 web 应用程序。由于您现在在做逻辑客户端而不是服务器端,而不是使用 Express 在登录后重定向到另一个路由,您必须进行客户端路由。

    这意味着在您收到来自 API 的成功响应 (200) 后,您必须将客户端定向到所需的路由。所以你会做这样的事情:

    if (user) {
      window.location = "/dashboard";
    }
    

    但是,您似乎是在无意中执行客户端逻辑。因此,我建议您停止使用 XMLHttpRequest 并只使用 <form>,就像您在其他帖子中所做的那样,并继续努力尝试使其正常工作。通过这种方式,您可以继续构建服务器渲染的 ExpressJS 应用程序。

    【讨论】:

    • Niels,您知道如何在重定向之前传递授权标头吗?更具体地说,由于 HTTP 和服务器(快递)是无状态的,我如何确保从现在开始的每个请求(用户登录后)在标头中都有授权令牌?请看看我的另一个帖子:stackoverflow.com/questions/50643768/…
    • 这快把我逼疯了。关于如何处理 Firebase Authentication + Express 的文档不足
    • 您可以使用会话,因此当客户端登录时,您可以将该事实保存在 cookie 中。 [nodewebapps.com/2017/06/18/how-do-nodejs-sessions-work/](This 是一个很好的解释)在 Express 中使用会话。看看他在req.session 上设置属性的部分:你可以在那里添加一个像isLoggedIn 这样的布尔值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 2012-12-22
    • 1970-01-01
    相关资源
    最近更新 更多