Node.js进度指示器反馈

时间:2015-09-07 09:57:28

标签: javascript node.js

我对使用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);
    }
});

2 个答案:

答案 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);