我在Node.js Express中创建一个API,可能会收到大量请求。我真的很想知道请求有多大。
//....
router.post('/apiendpoint', function(req, res, next) {
console.log("The size of incoming request in bytes is");
console.log(req.????????????); //How to get this?
});
//....
答案 0 :(得分:13)
您可以使用req.socket.bytesRead
,也可以使用request-stats模块。
var requestStats = require('request-stats');
var stats = requestStats(server);
stats.on('complete', function (details) {
var size = details.req.bytes;
});
详细信息对象如下所示:
{
ok: true, // `true` if the connection was closed correctly and `false` otherwise
time: 0, // The milliseconds it took to serve the request
req: {
bytes: 0, // Number of bytes sent by the client
headers: { ... }, // The headers sent by the client
method: 'POST', // The HTTP method used by the client
path: '...' // The path part of the request URL
},
res : {
bytes: 0, // Number of bytes sent back to the client
headers: { ... }, // The headers sent back to the client
status: 200 // The HTTP status code returned to the client
}
}
因此,您可以从details.req.bytes
获取请求大小。
另一个选项是req.headers['content-length']
(但有些客户端可能不会发送此标头)。
答案 1 :(得分:0)
五年后,这是 Google 针对此问题的第一个链接。
但是这里不需要 npm 模块。并且 getCurrentDate() {
var date = DateTime.now().toString();
var dateParse = DateTime.parse(date);
var formattedDate = "${dateParse.day}-${dateParse.month}-${dateParse.year}";
return formattedDate;
}
数字也不能使用,因为套接字读取的每个字节都被计算在内,甚至是 HTTP 标头。更糟糕的是,对于同一个套接字,接下来的请求会继续增加该值。
最好的方法是为每个数据块使用一个简单的计数器:
req.socket.bytesRead
答案 2 :(得分:0)
您不能使用 req.socket.bytesRead
,因为 socket
是可重用的,所以 bytesRead
是传递给给定 socket
的总流量的大小,而不是特定请求的大小。
我使用的一个快速解决方案 - 一个很小的中间件(我使用 Express):
const socketBytes = new Map();
app.use((req, res, next) => {
req.socketProgress = getSocketProgress(req.socket);
next();
});
/**
* return kb read delta for given socket
*/
function getSocketProgress(socket) {
const currBytesRead = socket.bytesRead;
let prevBytesRead;
if (!socketBytes.has(socket)) {
prevBytesRead = 0;
} else {
prevBytesRead = socketBytes.get(socket).prevBytesRead;
}
socketBytes.set(socket, {prevBytesRead: currBytesRead})
return (currBytesRead-prevBytesRead)/1024;
}
然后您可以在中间件中使用 req.socketProgress
。