0

私はpkgcloudを使用して、openstack ストレージを管理する Web サービス (高速ベース) を構築しています。ファイルのダウンロードに問題があります。

ダウンロード用の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 に指示するにはどうすればよいですか? ダウンロード関数を、コールバックで 1 つのプロミスと返されたストリームで 1 つのプロミスでダウンロードを実行する関数でラップしようとしていますが、どうすればそれを行うことができますか?

4

0 に答える 0