响应一个图像(通过pipe道和response.end())导致奇怪的行为

我使用这个代码来pipe道图像给我的客户:

req.pipe(fs.createReadStream(__dirname+'/imgen/cached_images/' + link).pipe(res)) 

确实有效, 有时图像不能完全传输。 但是在客户端(浏览器)和服务器端(node.js)都不会抛出任何错误。

我第二次尝试是

 var img = fs.readFileSync(__dirname+'/imgen/cached_images/' + link); res.writeHead(200, { 'Content-Type' : 'image/png' }); res.end(img, 'binary'); 

但它导致了同样的奇怪的行为…

有人知道我的线索吗?

问候!

(抽象代码…)

 var http = require('http'); http.createServer(function (req, res) { Imgen.generateNew( 'virtualtwins/www_leonardocampus_de/overview/28', 'www.leonardocampus.de', 'overview', '28', null, [], [], function (link) { fs.stat(__dirname+'/imgen/cached_images/' + link, function(err, file_info) { if (err) { console.log('err', err); } console.log('file info', file_info.size); res.writeHead(200, 'image/png'); fs.createReadStream(__dirname+'/imgen/cached_images/' + link).pipe(res); }); } ); }).listen(13337, '127.0.0.1'); 

Imgen.generateNew只是创build一个新文件,将其保存到磁盘并返回path(链接)

我以前用过这个,所有需要的是在function (req, res) {

 var path = ...; res.writeHead(200, { 'Content-Type' : 'image/png' }); fs.createReadStream(path).pipe(res); 

其中path是要发送的文件的计算path。 .pipe()将读取stream中的数据传输到写入stream,并在读取stream结束时调用结束,因此不需要使用res.end()

问题是什么:

我有2个不同的writeStreams! 如果WriteStram#1closures,第二个也应该closures,然后它应该都是pipe道…

但节点是asynchronous的,所以当一个已经closures,另一个没有。 即使stream.end()被称为…以及你总是应该等待closures事件!

thx家伙的帮助!