gpt4 book ai didi

node.js - 流错误处理/后备 Node

转载 作者:太空宇宙 更新时间:2023-11-03 23:36:41 26 4
gpt4 key购买 nike

我正在尝试使用nodejs流(第一次使用流,所以请耐心等待)从云存储(azure blob存储)获取图像。在获取请求中,我在流中获取所请求的图像文件,并希望将其流式传输回客户端。如果图像以请求的分辨率存在于 blob 存储中,我希望将图像直接通过管道传输回响应。如果请求的分辨率不存在,我想获取原始图像,调整其大小(通过 Sharp() 转换传递它)并将其传输回响应。如果原始图像不存在,我想获得一个后备图像并提供锐利变换等服务。

问题是我想将所有这些逻辑放入一个返回流的函数中(可用于管道到其他函数),而不是传递结果将通过管道传递到的目标流。我也不想一遍又一遍地重复每个不同情况的转换逻辑。

到目前为止,我做了如下事情:

if (!size) {
return blobService
.fetch(avatarId)
.on('error', function (e) {
logger.error({error: e}, 'avatar not found');
})
} else {
return blobService
.fetch(avatarId + '_s' + size)
.on('error', function (e) {
logger.info({err: e}, 'converted file not found');
// TODO: this return does not work, thus not serving custom resized images
return blobService
.fetch(avatarId)
.on('error', function (e) {
logger.error({err: e}, 'original file not found');
//TODO: if the original was not found then fetch a default image and serve that.
return blobService
.fetch(defaultId)
.on('error', function (e) {})
.pipe(sharp().resize(size, size)); //TODO: I should not have to repeat this (or 10 other steps) again and again
})
.pipe(sharp().resize(size, size));
});
}

问题是错误处理程序内的 return 语句不执行任何操作。我还尝试声明一个双工流并在逻辑路径中使用它并在最后返回它,但我返回的只是一个空流。

最佳答案

当您执行第一次return blobService时,您将读取流发送到写入流。问题是,一旦可读流发生错误,它就会关闭,因此您的写入流也会关闭。这就是为什么你总是得到空数据的原因。

您需要的是一个双工流,并从您的第一个 blobService 写入它。如果发生错误,请勿关闭双工流。相反,在错误回调中开始读取第二个 blobService 并写入双工流。

您可以从 Node 的 stream 创建双工流图书馆。但为了简单起见,我使用 through2 给出一个示例:

var through = require('through2')

function imageService(){

var duplex = through(function(chunk,enc,callback){
this.push(chunk)
callback()
})

blobService
.fetch(avatarId + '_s' + size) // your first readable stream
.on('error',function(){ // error on the first readable stream
blobService
.fetch(avatarId) //your second readable stream
.on('error', function(){ //error on 2nd readable stream
//do it again...
})
.pipe(duplex) //write your second readable stream
})
.pipe(duplex) // write your first readable stream

return duplex;
}

关于node.js - 流错误处理/后备 Node ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31449996/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com