我在节点中编写了一个非常简单的代理服务器。它接受请求,传递它,然后收集响应,并将其发送回原始调用者。代理的主要目的是使用回调将响应包装到原始调用者。我遇到的问题是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
时附加了回调。但是,由于我不知道可以调用多少次,因此我不知道何时打包回调的最后)
。
答案 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();
});
}