代理服务器与Node.js上的Express包装callback多次

问题

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

 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(); }); } 

我所试过的

我试图通过添加一个计数器variables来解决这个问题。 那么我只在counter === 0时附加callback。 但是,由于我不知道可能会被调用多less次,所以我不知道什么时候callback最后一个)

一个可能的解决scheme是这样的:

 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(); }); } 

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

你需要一个variables标志来说明你是否需要发送一个右括号:

 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(); }); }