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

Javascript 响应图像(通过管道和response.end())会导致奇怪的行为,javascript,node.js,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,

我使用以下代码向我的客户传送图像:

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');
但它会导致同样的奇怪行为

有人给我线索吗

(抽象代码…)


Imgen.generateNew
只需创建一个新文件,将其保存到磁盘并返回路径(链接)。

我以前使用过它,所需的只是
函数(req,res){

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

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

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


但是节点是异步的,所以当一个节点关闭时,另一个节点没有关闭调用了…您应该始终等待关闭事件!

管道代码可能在回调中吗?哦,是的!是…但这会影响管道吗?仅供参考:节点版本:0.8。1@johannesboyne:在获得半个映像后,能否验证磁盘上的映像(即由
Imgen.generateNew生成的映像)
是否正确?我怀疑这可能是您的罪魁祸首…还应该注意,
res.writeHead(200,'image/png');
正在将头200设置为image/png。当前您的代码将内容类型返回为application/octet stream。您的意思可能是
writeHead(200,{“Content Type”:“image/png”)
就像我写的那样,它确实有效,但有时它只传输一半的数据。atm我尝试了所有的组合(因为它总是一样的……正如你看到的,我因为这种行为而疯了)看这里,我想你可能会在那里调用
res.end()
管道(res)之前结束
res
已完成。您能显示此代码的完整上下文吗?嘿,我正在做一些奇怪的行为:
res.writeHead(200,{'Content-Type':'image/png'});fs.createReadStream(outputFolder+filename+'.png').pipe(res);
但我发现chrome中的响应是以原始数据的形式出现的。也就是说,chrome没有注意到它是一个图像,它说它是一个文档?但它确实呈现了图像mime类型是image/png。我所有的图像都是png。我应该关闭一些流连接还是什么?我只是快速阅读了你的问题,但看起来像是节点发送的图像字符串已编码,而不是二进制。您可以尝试将编码标志设置为
createReadStream
:请参阅
var path = ...; 
res.writeHead(200, {
  'Content-Type' : 'image/png'
});
fs.createReadStream(path).pipe(res);