带有Express on Node.js的代理服务器多次包装回调

时间:2017-03-16 19:41:02

标签: javascript node.js express proxy

问题

我在节点中编写了一个非常简单的代理服务器。它接受请求,传递它,然后收集响应,并将其发送回原始调用者。代理的主要目的是使用回调将响应包装到原始调用者。我遇到的问题是response.on('data', function...多次被大型响应调用,并且回调每次都被包装(只希望它在整个响应中被包裹一次)

代码

function respond(response) {
res.statusCode = response.statusCode;
// when the server sends a data

response.on('data', function(chunk) {
  var chunkString = '';
  // wrap chunck in callback
  if (jsonpCallback !== '') {
    chunkString += jsonpCallback;
    chunkString +=  '(';
    chunkString += chunk.toString();
    chunkString += ')';

    res.write(chunkString);

  } else {
    chunkString += chunk.toString('utf8');
    res.write(chunkString);
  }
});

response.on('end', function() {
  res.end();
});
}

我尝试过什么

我尝试通过添加计数器变量来解决问题。然后我只在counter === 0时附加了回调。但是,由于我不知道可以调用多少次,因此我不知道何时打包回调的最后)

2 个答案:

答案 0 :(得分:1)

一种可能的解决方案是这样的:

function respond(response) { 
    var payload = "";
    res.statusCode = response.statusCode; // when the server sends a data 

    response.on('data', function(chunk) { 
        payload += chunk;
    }); 

    response.on('end', function() { 
        if (jsonpCallback !== "") { 
            res.write(jsonpCallback + "(" + payload + ")");
        } else { 
            res.write(payload.toString('utf8'));
        }
        res.end(); 
   }); 
}

这样,您首先从原始响应中收集所有数据,并且只有在完成后才将其发送给原始请求者。

答案 1 :(得分:0)

你需要一个变量标志,说明你是否需要发送一个结束括号:

function respond(response) {
    res.statusCode = response.statusCode;
    var needClose = false;

    response.on('data', function(chunk) {
      if (jsonpCallback !== '' && !needClose) {
          res.write( jsonpCallback );
          res.write( '(' );
          needClose = true;
      }
      res.write(chunk.toString('utf8'));
    });

    response.on('end', function() {
       if (needClose) res.write( ')' );
       res.end();
    });
}