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

标签 node.js azure stream

我正在尝试使用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/

相关文章:

node.js - SequelizeJS 无法连接到 "MY"互联网上的 RDS 实例

node.js - Knex 迁移中特定类型文本数组的默认值不起作用

sql-server - 如何连接 cosmos 和 sql 数据库中的数据?

java - 无法将 Spring Boot 应用程序部署到 Azure

javascript - 如何将流、 promise 和管道一起编写单元测试?

java - 为什么我的对象流被损坏?流损坏异常

node.js - app.all ('*' ) 与 app.use(function) 之间的区别?

javascript - 如何在 javascript 中定义模块的导出?

azure - 上传 zip 文件时 Windows Azure 中出现错误 : "ZipException was unhandled" "EOF in header"

python - 我可以使用python VLC流式传输文件吗?