我可以在Express中延迟PUT上传,直到我的服务器完成操作吗?

时间:2016-09-20 10:32:39

标签: http express browser amazon-s3

我有一台服务器通过PUT接收文件,然后将它们存储在S3中。

在客户端PUTs文件之后,它通常会正确地请求它们以进行渲染。不幸的是,我的服务器花了一些时间来实际处理上传并将它们存储在S3中。

以下是我在Express中使用的代码:

    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);
    }

理想情况下,我可以“停止”我的客户端的PUT请求,直到storage.store()完成,确保文件实际可用。

我有什么方法可以做到这一点吗?

此外,我不确定sendStatus() / end()来电,如果我混淆了一些内容,请随时发表评论。

P.S。我知道,在一个理想的世界里,我只会分发签名的URL并让客户端直接上传到S3,但我需要AES256加密......

1 个答案:

答案 0 :(得分:0)

我不熟悉S3上传,但我想会有一个回调(比如发回一个回复(成功或失败等等)给你)。 (如果没有,请告诉我)

S3.upload(data,function(response){ // something like this
  // then, you can callback
  // ...
  // res.end() or res.sendStatus(...)
})

我记得它,Express不会自动发送超时,所以你只需将响应放在S3的响应函数中,这样你的请求就不会在你的存储结束之前结束。

  

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

     

如果您调用res.send(),则不必调用res.end()。 res.send()为你调用res.end()。

和res.sendStatus()等于res.status(...)。send(消息或代码)(通过http://expressjs.com/en/api.html

因此,res.sendStatus()将调用end()。