Node.js进度指示器反馈

Rië*_*iël 3 javascript node.js

我对使用Node.js“请求”发送的进度有疑问。我有一个充当代理的Node.js应用程序,实际上将主体转发到另一台服务器。我想查看此上传操作的进度。现在我正在这样做:

BROWSER 
   -> UPLOAD TO NODE 
   -> UPLOAD TO 3rd PARTY SERVICE 
   -> RETURN 3rd PARTY RESPONSE TO BROWSER
Run Code Online (Sandbox Code Playgroud)

如果可能的话,我将其记录下来以检查console.log取得了多少进展。但是,也有可能返回一个

res.send(progress)
Run Code Online (Sandbox Code Playgroud)

同时,在等待上传完成并将客户端发送回客户端的同时,上传成功了吗?

BROWSER 
   -> UPLOAD TO NODE
   -> UPLOAD TO 3rd PARTY SERVICE 
       -> RETURN progress <- 
       -> RETURN progress <- 
       ...etc.
   -> RETURN 3rd PARTY RESPONSE TO BROWSER
Run Code Online (Sandbox Code Playgroud)

这是上载代码(非常简单)。

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);
    }
});
Run Code Online (Sandbox Code Playgroud)

Fel*_*tus 6

您的问题分为两部分。一种是从请求中获取进度,可以在这里找到:上传进度-请求

另一部分将通知浏览器进度。HTTP协议不允许您发送多个响应,因此res.send(progress)无法使用。

但是,您可以继续发送部分响应,直到完成为止。在不关闭res的情况下编写某些内容就像一样简单res.write("string"),但是访问响应可能会更困难:使用AJAX或WebSockets访问部分响应?

您还需要一种从后备服务器包装正文(以及错误)的方法,以使其可以作为最终的部分响应。

另一个解决方案是打开另一个WebSocket请求以跟踪上载/下载过程。socket.io是用于此目的的不错的节点库。