在 NodeJS 中获取原始 HTTP 响应
Get raw HTTP response in NodeJS
我可以通过这种方式获取原始 HTTP 请求:
// ...
server.listen(8080);
server.on('connection', function(socket) {
socket.on('data', function(data) {
console.log(data.toString());
});
});
但是如何在 NodeJS 中获得原始答案(HTTP 响应)?
我需要类似的东西(在我的 NodeJS 中,而不是浏览器中):
HTTP 200 OK
Content-Length: 1000
...
我很好奇你到底想解决什么问题,因为可能有更好的方法。
但是,如果您只是想侵入给定的响应以准确查看通过该套接字发送的内容,您可以猴子修补 socket.write()
方法来执行如下操作:
const app = require('express')();
app.get("/", (req, res) => {
// monkey patch socket.write
// so we can log every sent over the socket
const socket = req.socket;
socket.origWrite = socket.write;
socket.write = function(data, encoding, callback) {
if (Buffer.isBuffer(data)) {
console.log(data.toString());
} else {
console.log(data);
}
return socket.origWrite(data, encoding, callback);
}
res.cookie("color", "blue");
res.send("Hi. This is my http response.")
});
app.listen(80);
当我 运行 并向该路由发出浏览器请求时,我在我的控制台中看到了这个:
HTTP/1.1 200 OK
X-Powered-By: Express
Set-Cookie: color=blue; Path=/
Content-Type: text/html; charset=utf-8
Content-Length: 30
ETag: W/"1e-eJoRAEkyvi+cvBVvRkYOHolFbNc"
Date: Wed, 15 Dec 2021 19:43:20 GMT
Connection: keep-alive
Keep-Alive: timeout=5
Hi. This is my http response.
这与 Chrome 调试器显示的 http 响应在事物的接收端完全匹配。
我花了相当多的时间寻找 nodejs 内置的一些调试标志,这些标志会自动输出,但找不到任何东西。 'net' 模块确实有一些调试,但它与套接字事件和生命周期有关,而不是实际数据 sent/received.
仅供参考,您还可以使用网络分析器“检查”原始网络数据,例如 WireShark(还有许多其他分析器),它可以修补到您的网络适配器中,并且可以配置为观察事物并向您显示确切的数据正在 sent/received.
我可以通过这种方式获取原始 HTTP 请求:
// ...
server.listen(8080);
server.on('connection', function(socket) {
socket.on('data', function(data) {
console.log(data.toString());
});
});
但是如何在 NodeJS 中获得原始答案(HTTP 响应)? 我需要类似的东西(在我的 NodeJS 中,而不是浏览器中):
HTTP 200 OK
Content-Length: 1000
...
我很好奇你到底想解决什么问题,因为可能有更好的方法。
但是,如果您只是想侵入给定的响应以准确查看通过该套接字发送的内容,您可以猴子修补 socket.write()
方法来执行如下操作:
const app = require('express')();
app.get("/", (req, res) => {
// monkey patch socket.write
// so we can log every sent over the socket
const socket = req.socket;
socket.origWrite = socket.write;
socket.write = function(data, encoding, callback) {
if (Buffer.isBuffer(data)) {
console.log(data.toString());
} else {
console.log(data);
}
return socket.origWrite(data, encoding, callback);
}
res.cookie("color", "blue");
res.send("Hi. This is my http response.")
});
app.listen(80);
当我 运行 并向该路由发出浏览器请求时,我在我的控制台中看到了这个:
HTTP/1.1 200 OK
X-Powered-By: Express
Set-Cookie: color=blue; Path=/
Content-Type: text/html; charset=utf-8
Content-Length: 30
ETag: W/"1e-eJoRAEkyvi+cvBVvRkYOHolFbNc"
Date: Wed, 15 Dec 2021 19:43:20 GMT
Connection: keep-alive
Keep-Alive: timeout=5
Hi. This is my http response.
这与 Chrome 调试器显示的 http 响应在事物的接收端完全匹配。
我花了相当多的时间寻找 nodejs 内置的一些调试标志,这些标志会自动输出,但找不到任何东西。 'net' 模块确实有一些调试,但它与套接字事件和生命周期有关,而不是实际数据 sent/received.
仅供参考,您还可以使用网络分析器“检查”原始网络数据,例如 WireShark(还有许多其他分析器),它可以修补到您的网络适配器中,并且可以配置为观察事物并向您显示确切的数据正在 sent/received.