Node.js表达:在发送之前获取HTTP标头

时间:2014-01-02 21:54:54

标签: node.js http express header content-length

我目前正在使用Express Web服务器插件在Node.js中创建一个应用程序。我想计算Web服务器发送的总数据。 为此,我需要获取传出HTTP标头的“Content-Length”字段。但是,我需要在添加数据后立即执行此操作。

如果我需要更改核心Express脚本,有人可以告诉我包含哪个文件吗?

3 个答案:

答案 0 :(得分:2)

如果您只想计算它,可以使用中间件:

var totalBytes = 0;
app.use(function(req, res, next) {
  res.on('finish', function() {
    totalBytes += Number(res.get('content-length') || 0);
  });
  next();
});

您必须尽早将中间件堆栈包含在您要计算其内容的任何其他中间件之前。

此外,这不会计算任何未设置Content-Length标头的流数据。

答案 1 :(得分:1)

您可以添加中间件来修补响应方法。它很难看,但比改变核心Express文件要好。

计算标准和流式响应的总体字节数。将其置于任何其他app.use()指令之前。

app.use(function(req, res, next) {
  res.totalLength = 0;

  var realResWrite = res.write;
  res.write = function(chunk, encoding) {
    res.totalLength += chunk.length;
    realResWrite.call(res, chunk, encoding);
  };

  var realResEnd = res.end;
  res.end = function(data, encoding) {
    if (data) { res.totalLength += data.length; }
    console.log('*** body bytes sent:', res.totalLength);
    realResEnd.call(res, data, encoding);
  };

  next();
});

答案 2 :(得分:0)

如果你想在每个请求上计算它,那么你可以尝试下面的代码!!!

var totalByte=0;
app.all('*', function(req,res, next){
    res.on('finish', function() {
        totalByte = parseInt(res.getHeader('Content-Length'), 10);
        if(isNaN(totalByte))
            totalByte = 0;
   });
    next(); 
});

请记住totalByte在这里是一个全局变量,它为每个请求增加了值