私はPUT経由でファイルを受け取り、それをS3に保存するサーバーを持っています。サーバーが操作を終了するまで、ExpressでPUTアップロードを延期することはできますか?
クライアントがファイルをPUTした後、通常はレンダリングのためにファイルを要求します。残念ながら、私のサーバーは実際にアップロードを処理してS3に保存するのに少し時間がかかります。
req.pipe(writeStream);
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'PUT, OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type');
if ('OPTIONS' === req.method) {
res.sendStatus(200);
res.end('OK!');
return;
}
if ('PUT' === req.method) {
writeStream.on('error',() => {
res.sendStatus(500);
});
writeStream.on('close', async() => {
// This might take 30s
await this.storage.store(fn, args.blobID);
// This does not seem to have any effect
// I would like to prevent the client from 'finishing' the
// PUT request before I say it is done.
res.end('OK!')
});
res.sendStatus(200);
}
理想的には、私は、ファイルが実際に利用可能であることを確認すること、「失速」storage.store()
が完了するまでは私のクライアントのPUT要求をことができます:ここで
は、私はExpressで使用するコードです。
どうすればいいですか?
また、私はsendStatus()
/end()
コールについてはわかりませんが、何かを混ぜてもお気軽にコメントしてください。
P.S.理想的な世界では、署名されたURLを渡してクライアントがS3に直接アップロードできるようにしていますが、AES256の暗号化が必要です...
ありがとうございました。しかし、私は 'res.sendStatus(200);'を呼び出して、実際のクライアントのアップロードを開始する必要があるようです。また、store関数は 'async'で、S3のアップロードが完了するのを待ちます。 – left4bread