Nodejs中如何获取location hash

Nodejs中如何获取location hash

url 为 http://www.XXXXX.com/#access_token=610072509487211cb74a84b821d8ea69f1a308a3313fb03196987902 DOM 中获取 是window.location.hash , Express 怎么获取 这个access_token req.url 有时能获取(调试时),但是不调试获得的是/

6 回复

Node.js 中如何获取 location hash

在 Node.js 中,如果你希望通过 Express 框架来获取 URL 的 hash 部分(例如 #access_token=610072509487211cb74a84b821d8ea69f1a308a3313fb03196987902),你需要知道一些基本概念。在浏览器环境中,你可以通过 window.location.hash 来获取 hash 部分,但在服务器端的 Node.js 中,你无法直接访问浏览器的 window 对象。

获取 Hash 参数

在客户端,你可以使用 window.location.hash 来获取 URL 的 hash 部分。例如:

console.log(window.location.hash); // 输出: #access_token=610072509487211cb74a84b821d8ea69f1a308a3313fb03196987902

然而,在服务器端,你需要通过其他方式来解析 URL 和获取 hash 部分。一个常见的方法是通过前端 JavaScript 将 hash 部分发送到后端。

示例:通过前端 JavaScript 发送 Hash 到后端

假设你有一个简单的 HTML 页面:

<!DOCTYPE html>
<html>
<head>
    <title>Get Hash Example</title>
</head>
<body>
    <script>
        window.onload = function() {
            var hash = window.location.hash.substring(1); // 去掉 #
            fetch('/get-hash', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded'
                },
                body: hash
            });
        }
    </script>
</body>
</html>

然后在你的 Express 应用中处理这个请求:

const express = require('express');
const app = express();
const port = 3000;

app.use(express.json());
app.use(express.urlencoded({ extended: true }));

app.post('/get-hash', (req, res) => {
    console.log(req.body); // 输出: { "access_token": "610072509487211cb74a84b821d8ea69f1a308a3313fb03196987902" }
    res.send('Hash received');
});

app.listen(port, () => {
    console.log(`Server running at http://localhost:${port}/`);
});

在这个例子中,我们通过 fetch API 将 hash 发送到 /get-hash 端点。在 Express 应用中,我们使用 express.urlencoded 中间件来解析请求体中的数据,并将其作为 req.body 访问。

结论

在 Node.js 中,直接从 req.url 获取 hash 部分是不可能的,因为 hash 部分不会出现在服务器接收到的 URL 中。你需要通过前端 JavaScript 将 hash 发送到后端,然后在后端通过解析请求体来获取它。


这个是其他网站返回过来的格式

试了一下,浏览器发请求的时候应该是把“#”后面的忽略掉了,所以只能通过前端取值再放到querystring或body或其它地方(header、params)里传过去了

恩,谢谢,

如果用锚点来进行SAP的前端路由的话,也碰到这个问题,在跳转登陆以后再跳转回来,无法保持原来的状态(锚点非http协议,不会传给后端)。暂时没有想到好的解决方案,希望一起讨论

要在Node.js中通过Express框架获取URL中的#access_token片段,需要理解浏览器端与服务器端处理URL的不同方式。浏览器的window.location.hash可以直接获取#后的部分,但在服务器端(如Express)通过常规的req.url是无法直接访问这部分信息的,因为这部分数据不会被发送到服务器。

解释

在客户端(浏览器中),可以通过JavaScript来获取hash部分:

// 在浏览器中
const hash = window.location.hash; // 获取 # 后面的部分,例如 "#access_token=..."

然而,在服务器端(使用Node.js + Express),当你请求一个包含hash的URL时,HTTP协议本身并不会将#及之后的部分发送到服务器。这意味着如果你尝试使用req.url或任何其他方法直接从Express请求对象中获取#access_token,是行不通的。

解决方案

如果你需要从客户端传递一些信息到服务器,通常的做法是通过URL的查询字符串(query string)或者使用POST请求。例如,你可以将access_token放在查询字符串中,这样可以在服务器端通过req.query获取:

修改URL以包含查询字符串:

将URL从http://www.XXXXX.com/#access_token=...修改为http://www.XXXXX.com/?access_token=...

示例代码:

客户端(浏览器端):

// 假设用户点击了一个链接
window.location.href = 'http://www.XXXXX.com/?access_token=610072509487211cb74a84b821d8ea69f1a308a3313fb03196987902';

服务器端(Node.js + Express):

const express = require('express');
const app = express();

app.get('/', (req, res) => {
    const accessToken = req.query.access_token;
    console.log('Access Token:', accessToken);
    res.send(`Received Access Token: ${accessToken}`);
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

当上述URL被请求时,服务器端会打印出Access Token的值,并将其作为响应的一部分返回给客户端。

这种做法确保了客户端的数据能够安全地传输到服务器端。

回到顶部