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

时间:2012-07-11 07:49:51

标签: javascript node.js

我使用此代码将图像传送给我的客户:

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只需创建一个新文件,将其保存到磁盘并返回路径(链接)。

2 个答案:

答案 0 :(得分:2)

我之前使用过这个,所需要的只是function (req, res) {

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

其中path是要发送的文件的计算路径。 .pipe()将数据从读取流传输到写入流,并在读取流结束时调用结束,因此无需在{。}之后使用res.end()

答案 1 :(得分:2)

问题是什么:我有两个不同的writeStreams!如果WriteStream#1关闭,第二个也应关闭,然后全部应该通过管道传输。

但是节点是异步的,所以当一个节点已经关闭时,另一个节点却没有。甚至stream.end()都被调用了......你总是应该等待关闭事件!