【问题标题】:XHR Get request doesn't load the received HTML string from Express appXHR Get 请求不加载从 Express 应用程序接收到的 HTML 字符串
【发布时间】:2021-02-12 02:32:54
【问题描述】:

我正在构建我的第一个快递应用。 到目前为止,我来自前端的所有请求都是由 GET 请求的锚元素和 POST 请求的元素触发的。来自服务器的所有响应都是使用 express 函数 res.render() 或 res.redirect() 生成的。

现在我正在尝试使用 json web 令牌和 localStorage 实现用户身份验证。用户登录后,我会在后端生成一个令牌并将其发送到前端,如下所示:

 res.render('loggedIn', {token: token});

然后我将这个令牌保存在 localStorage 中(在 pug 模板中):

 const token = !{JSON.stringify(token)};
 window.localStorage.setItem('token', token);

到目前为止一切顺利,但现在我必须将我的令牌发送回后端 - 根据我的阅读内容,通过将其包含在请求标头中可以直接这样做。但是由于我的请求仅通过锚元素提出,我现在必须提出自己的“自定义”请求吗??

所以使用 XMLHttpRequest 我的代码是:

function sendGetWithAuth(endUrl) {
    return new Promise((resolve, reject) => {
        let request = new XMLHttpRequest();
        request.open('GET', endUrl);
        request.onreadystatechange = () => {
            if (request.readyState === 4){
                resolve(request.response);
            }
        }
        request.setRequestHeader('x-auth-token', window.localStorage.getItem('token'));
        request.send();
    });
}

我没有使用锚元素,而是在我的目标上设置了一个点击事件监听器:

target.addEventListener('click', () => {
    const endUrl = '/job/6789'
    sendGetWithAuth(endUrl).then(
            (response) => {
                console.log(response);
            }
    )
});

当我返回浏览器时,单击我的目标,XHR 请求发送正常,标头包含我的令牌,响应负载包含 res.render() 发送的 HTML,但页面上没有任何反应,我仍然在我单击目标的同一页面上,并且没有被重定向到请求的页面。请求的状态是:[HTTP/1.1 304 Not Modified 1ms]

(当我的目标是链接 <a href='/job/6789'>TARGET </a> 时,它工作正常(我被重定向到 /job/6789 页面。(但没有使用锚元素设置标题)。

我的第一个问题是:在 XHR GET 请求之后如何在浏览器中加载 HTML 字符串响应?

[编辑 30-10-2020] 我的新问题是:XHR GET 和结束 url 与同一个结束 url 的链接(带有锚标记)有何不同。

有没有办法放置一个“自定义”请求,将重定向到请求的结束 url?

我尝试在放置 XHR GET 请求后添加window.location = endUrl(在同一个事件处理程序中)。它放置 XHR GET 然后将我重定向到 endUrl 但我在途中丢失了我的令牌。

(在浏览器的控制台中,我看到 XHR GET endUrl,然后是“浏览器导航到:/endUrl”,然后是另一个 GET endUrl(由我假设的重定向引起,但它覆盖了我的 XHR 请求的标头)所以我登陆请求页面但没有我的令牌。

【问题讨论】:

  • .then( (response) => { return response; }) 等价于.then( r => r)。它什么也不做。您正在无处返回响应。您需要将响应传递给另一个函数。
  • 您不需要自定义请求。使用饼干。这回答了你的问题了吗? How to store jwt in cookie and pass it to authentication function when redirecting a page?
  • 您只是将响应值返回到位空间,而是进行重定向。
  • 快速说明:window.localStorage 可以缩短为localStorage

标签: javascript node.js express http xmlhttprequest


【解决方案1】:

使用localStorage 非常适合前端应用程序,但在您的情况下,使用 cookie 可能会更好。通过在你的 expressjs 路由处理程序中调用 res.cookie(<name>, <value>, <options>) 来植入一个 cookie,然后安装 npm 包 cookie-parser,需要它,将它用作你的应用程序中的中间件,然后你可以简单地在你的工作路由处理程序中使用 req.cookies.<name>。通过这种方法,您可以使用直接指向该 URL 的锚点。

【讨论】:

  • 谢谢@expressjs123。事实上,这是一个很好的解决我最初需求的工作:设置身份验证。通过使用 cookie 而不是 localStorage,我不再需要放置自定义请求,并且可以检查传入的 cookie jwt.verify(req.cookies.token, 'SECRET') 以允许或不允许访问某些路由!有用 ! ->我仍然想知道:对一个结束 url 的 XHR GET 请求与对同一结束 url 的锚标记有何不同我猜 XHR 是为了允许在 html 页面中注入数据而无需重新加载页面,也许这就是它没有重定向到结束 url 的原因?
猜你喜欢
  • 2017-05-06
  • 2021-10-24
  • 2018-01-17
  • 2014-10-14
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
相关资源
最近更新 更多