代理服务器与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(); }); }