Nodejs中如何获取location hash
Nodejs中如何获取location hash
url 为 http://www.XXXXX.com/#access_token=610072509487211cb74a84b821d8ea69f1a308a3313fb03196987902
DOM 中获取 是window.location.hash ,
Express 怎么获取 这个access_token
req.url 有时能获取(调试时),但是不调试获得的是/
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
的值,并将其作为响应的一部分返回给客户端。
这种做法确保了客户端的数据能够安全地传输到服务器端。