0

我正在使用pkgcloud构建一个 web 服务(基于 express)来管理我的 openstack 存储。我在下载文件时遇到问题。

用于下载的pkgcloud api 有点奇怪:它将错误和文件的元数据传递给回调,并从函数返回带有文件内容的可读流:

client.download({
    container: 'my-container',
    remote: 'my-file'
}, function(err, result) {
    // handle the download result
})).pipe(myFile);

我遇到的问题是 - 我怎样才能将错误、元数据和流放在一起?我需要元数据来为我的结果设置内容类型,显然我需要错误来知道一切是否顺利(如果文件不存在,流仍然返回 - 只包含一个 html 错误消息,所以我不能指望那个错误)。

我试着这样称呼它:

router.get("/download", function (res, req) { 
 var stream = client.download(options, function (err, file) {
  if (err) {
    return res.status(err.status).json({'message' : 'Error downloading file from   storage: ' + err.details});
  } 
 }
 // I'd like to get the callback's err and file here somehow
 stream.pipe(res);
}); 

但问题是数据在调用回调之前通过管道传输到 res,所以回调没有帮助 - 它要么给我错误太晚,要么不给我元数据。我也尝试将 stream.pipe(res) 移动到回调中,但它不起作用,因为在回调中我无法访问结果流。

我想过为此使用promise,但是我怎样才能告诉promise“等待”回调和返回值呢?我试图用一个函数包装下载函数,该函数将在回调中使用一个承诺和在返回的流中运行下载,但我该怎么做呢?

4

0 回答 0