2016-09-20 2 views
0

私は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の暗号化が必要です...

答えて

0

私はS3のアップロードに精通していませんが、コールバック(あなたに応答(成功か失敗かなど)を返すなど)。私はそれを覚えているように、Expressは自動的にタイムアウトを送信しないので、あなたの要求はあなたの保管最後まで終わらないように、あなただけの、S3の応答関数に応答を入れ

S3.upload(data,function(response){ // something like this 
    // then, you can callback 
    // ... 
    // res.end() or res.sendStatus(...) 
}) 
を(ない場合は、私に教えてください) 。

Must res.end() be called in express with node.js?

からあなたはres.endを()あなたはres.sendを呼び出す場合()を呼び出す必要はありません。 res.send()はres.end()を呼び出します。 (http://expressjs.com/en/api.html経由)

とres.sendStatus()(...)res.statusすることと等しい。(メッセージまたはコード)を送信

ので、res.sendStatusは())(エンドを呼び出します。

+0

ありがとうございました。しかし、私は 'res.sendStatus(200);'を呼び出して、実際のクライアントのアップロードを開始する必要があるようです。また、store関数は 'async'で、S3のアップロードが完了するのを待ちます。 – left4bread

関連する問題