私は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 つのプロミスでダウンロードを実行する関数でラップしようとしていますが、どうすればそれを行うことができますか?