5

我正在通过我的 Node.js 服务器代理 S3 调用,并希望在代理它们之前只调整几个返回的 XML 值。除了那些调整之外,我想保留每个响应的其余部分,例如响应标头。

我当然可以先收集整个响应,解析 XML,对其进行转换,然后将其返回,但对于大型响应而言,这将是缓慢且占用大量内存的。有没有一种方法可以实现基本stream.pipe()但可能具有转换功能?

我看过sax-js,它可以管道但没有任何转换能力。我是否必须求助于侦听低级解析事件并自己生成和输出生成的 XML?

我还查看了具有“推送解析器”和更高级别 DOM API 的libxmljs,但看起来我必须再次自己收听低级解析事件,而且我不确定我是否可以流式传输生成的 XML输出

有没有比这两种方法更简单的方法?谢谢!

PS XML 的调整很简单:只是从一些文本元素中删除一个子字符串。

4

1 回答 1

3

在这种情况下,您可以将所有块收集在一起,如下所示:

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);
于 2013-07-24T05:58:15.427 回答