我有一台服务器通过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加密......
答案 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()。