我对使用Node.js'请求'发送的进度有疑问。我有一个Node.js应用程序充当代理,实际上将一个主体转发到另一个服务器。我希望看到此上传操作的进度。现在我这样做:
BROWSER
-> UPLOAD TO NODE
-> UPLOAD TO 3rd PARTY SERVICE
-> RETURN 3rd PARTY RESPONSE TO BROWSER
如果可以,我会记录它以检查console.log进行了多少进展。但是,是否也可以返回
res.send(progress)
同时,等待上传完成并发回客户端上传成功了吗?
BROWSER
-> UPLOAD TO NODE
-> UPLOAD TO 3rd PARTY SERVICE
-> RETURN progress <-
-> RETURN progress <-
...etc.
-> RETURN 3rd PARTY RESPONSE TO BROWSER
这是上传代码(非常简单)。
var requestOptions = {
timeout: 120000,
url: url, //URL to hit
method: 'post',
headers: headers,
body: payload //Set the body as a string
};
request(requestOptions, function (error, response, body) {
if (error) {
res.send(error);
}
else {
//res.sendStatus(response.statusCode);
console.log("[RETURNING RESPONSE BODY]");
res.send(body);
}
});
答案 0 :(得分:6)
您的问题包含两部分。一个是从请求中获取进度,可在此处找到:Upload Progress — Request
另一部分将通知浏览器进度。 HTTP协议不允许您发送多个响应,因此无法使用res.send(progress)
。
但是,您可以继续发送部分响应,直到完成为止。在不关闭内容的情况下将内容写入res就像res.write("string")
一样简单,但访问响应可能更难:Accessing partial response using AJAX or WebSockets?
您还需要一种方法来从支持服务器包装正文(以及错误),以便它可以作为最终的部分响应。
另一种解决方案是打开另一个WebSocket请求来跟踪上传/下载过程。对于此目的,socket.io是一个很好的节点库。
答案 1 :(得分:1)
第一部分的解决方案是在r.req.connectin.bytesWritten
中var r = request(requestOptions, function (error, response, body) {
clearInterval(q);
...
});
var q = setInterval(function () {
console.log("Uploaded: " + r.req.connection.bytesWritten);
}, 250);