如何获取请求的字节大小?

时间:2015-08-30 10:44:20

标签: node.js express

我在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?
});
//....

3 个答案:

答案 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