我正在通过Node.js服务器代理一个S3调用,并希望在代理之前只调整几个返回的XML值。除了这些调整之外,我想保留每个响应的其余部分,例如响应标头。
当然,我可以先收集整个响应,解析XML,转换它,然后返回,但对于大的响应,这将是缓慢和内存密集的。有没有一种方法可以基本上实现stream.pipe()
,但可能使用转换函数?
我看过sax-js,它可以管道传输,但没有任何转换能力。我是否必须求助于监听低级解析事件,并自己生成和输出结果XML?
我还研究了libxmljs;推送解析器";和更高级别的DOM API,但看起来我必须再次亲自收听低级别的解析事件,而且我不确定我是否可以在生成结果XML时将其流式输出。
有比这两种方法更简单的方法吗?谢谢
附言:XML的调整很简单:只需从一些文本元素中删除一个子字符串。
在这种情况下,您可以将所有块收集在一起,如下所示:
var data='', tstream = new stream.Transform();
tstream._transform = function (chunk, encoding, done) {
data += chunk.toString();
done();
};
并在最后调用_flush函数时执行您需要的操作:
tstream._flush = function(done){
data += 'hola muheres';
this.push(data);
done();
};
所以所有这些加在一起可以看起来像:
req.pipe(anotherstream).pipe(tstream).pipe(response);