Node.JS夏普库 – 结束后写错误

我有以下代码:

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); }); 

我第一次运行它工作正常。 第二次运行它时,我得到[错误:在结束后写入],它是在变压器stream的on('error')中发出的。

如果我只是这样做

 request(url).pipe(res); 

它工作正常,所以只有当你包括.pipe(变压器)位。

任何想法我做错了什么?

您创build双工(可读写)stream(转换器),它可用于不同的可读stream(请求)。 当你pipe道到变压器stream它被closures,然后你试图再次pipe道到相同的封闭stream。

 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