基本上,我想在使用转换流将http响应发送到客户端之前更改它,但我的代码会抛出错误:[错误:写完后]。
http://nodejs.org/api/stream.html#stream_writable_end_chunk_encoding_callback上的文档说:
调用end()后调用write()会引发错误。
在这种情况下,如何防止在end()之后调用write()?
var request = require('request');
var Transform = require('stream').Transform;
var http = require('http');
var parser = new Transform();
parser._transform = function(data, encoding, done) {
console.log(data);
this.push(data);
done();
};
parser.on('error', function(error) {
console.log(error);
});
http.createServer(function (req, resp) {
var dest = 'http://stackoverflow.com/';
var x = request({url:dest, encoding:null})
x.pipe(parser).pipe(resp)
}).listen(8000);
答案 0 :(得分:13)
流应该只使用一次,但是您为每个传入请求使用相同的转换流。在第一次请求时它会起作用,但当x
关闭时,parser
也会关闭:这就是为什么在第二个客户端请求中您会看到write after end
错误。
要解决此问题,只需在每次使用时创建一个新的转换流:
function createParser () {
var parser = new Transform();
parser._transform = function(data, encoding, done) {
console.log(data);
this.push(data);
done();
};
return parser;
}
http.createServer(function (req, resp) {
var dest = 'http://stackoverflow.com/';
var x = request({url:dest, encoding:null})
x.pipe(createParser()).pipe(resp)
}).listen(8000);