【发布时间】:2015-02-03 00:36:51
【问题描述】:
我正在向仅包含正文中的文件名的 nodejs 服务器发出 POST 请求。收到请求后,节点将相应的本地文件上传到 Amazon S3 存储桶。文件有时可能需要一段时间才能上传,有时请求会超时。如何延长或防止超时发生?
【问题讨论】:
标签: node.js file-upload http-request
我正在向仅包含正文中的文件名的 nodejs 服务器发出 POST 请求。收到请求后,节点将相应的本地文件上传到 Amazon S3 存储桶。文件有时可能需要一段时间才能上传,有时请求会超时。如何延长或防止超时发生?
【问题讨论】:
标签: node.js file-upload http-request
您可以在继续上传时将响应发送回浏览器。您不必等到上传完成后再完成响应。例如,您可以这样做:
res.end("done"); // or put whatever HTML you want in the response
而且,这将结束发布响应,浏览器会很高兴。同时,您的服务器继续完成上传。
这样做的好处是浏览器和用户可以愉快地进行他们想做的下一件事情,而无需等待服务器完成其业务。我知道的唯一缺点是,如果上传失败,您没有简单的方法来通知浏览器它失败了(因为响应已经完成)。
超时本身由浏览器控制。这不是您可以直接从服务器控制的东西。如果您不断地向浏览器发送数据,那么它可能不会超时。因此,只要继续上传,您就可以执行以下操作:
res.write(" ");
每 15 秒左右作为一种保持活动状态,让浏览器保持快乐并防止超时。您可能会设置一个 15 秒的间隔计时器来发送少量数据,然后在上传完成时停止计时器。
如果您在发布帖子的浏览器中控制 Javascript,那么您可以从浏览器中的 Javascript 设置 Ajax 调用的超时值。当您在浏览器中创建XMLHttpRequest 对象时,它有一个名为timeout 的属性,您可以为异步ajax 调用设置它。请参阅MDN 了解更多信息。
【讨论】: