我有以下代码:
var express = require('express');
var request = require('request');
var sharp = require('sharp');
var app = express();
var transformer = sharp()
.resize(100, 100)
.crop(sharp.gravity.north)
.on('error', function(err) {
console.log('ERR');
console.log(err);
});
app.get('/test', function(req, res) {
var url = 'http://i.ytimg.com/vi/tntOCGkgt98/maxresdefault.jpg';
request(url).pipe(transformer).pipe(res);
});
var server = app.listen(3000, function() {
var host = server.address().address;
var port = server.address().port;
console.log('Listening at http://%s:%s', host, port);
});
我第一次运行它时效果很好。第二次运行它时,我得到[错误:结束后写],该错误在转换器流的on('error')中发出。
如果我只是做
request(url).pipe(res);
它工作正常,因此仅当包含.pipe(transformer)位时才有效。
有什么想法我做错了吗?
创建双工(可读和可写)流(变压器),并且该流可用于不同的可读流(请求)。当您通过管道传输到转换器流时,它会关闭,稍后您尝试再次通过管道传输到相同的已关闭流。
var transformer = sharp();
var stream = require('stream');
// transformer is a stream
console.log("transformer instanceof stream.Duplex - ", transformer instanceof stream.Duplex); // true
// just a simple streams example
var readable = new stream.Readable();
var writable = new stream.Writable();
readable.push("data");
readable.push(null);
writable._write = function (chunk, encoding, done) {
console.log("Writable stream received data: ", chunk.toString());
done();
};
var _saved_original_end_method = writable.end;
// redefining end method just to see if it's executed
writable.end = function () {
console.log("Ending writable stream");
_saved_original_end_method.apply(this, arguments);
};
// first piping finished successfully
readable.pipe(writable);
var anotherReadableStream = new stream.Readable();
setTimeout(function () {
// this will cause an exception
anotherReadableStream.push("another data sample");
anotherReadableStream.push(null);
anotherReadableStream.pipe(writable);
}, 1000);
结果:
transformer instanceof stream.Duplex - true
Writable stream received data: data
Ending writable stream
events.js:85
throw er; // Unhandled 'error' event
^
Error: write after end
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句