【问题标题】:Node.js progress indicator feedbackNode.js 进度指示器反馈
【发布时间】:2015-09-07 09:57:27
【问题描述】:

我对使用 Node.js 'request' 发送的进度有疑问。我有一个充当代理的 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);
    }
});

【问题讨论】:

  • 使用 res.write() 发送请求更新。上传完成后使用res.end()

标签: javascript node.js


【解决方案1】:

您的问题包含两个部分。一种是从请求中获取进度,可以在这里找到:Upload Progress — Request

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

但是,您可以继续发送部分响应,直到完成为止。在不关闭的情况下将内容写入 res 就像 res.write("string") 一样简单,但访问响应可能更难:Accessing partial response using AJAX or WebSockets?

您还需要一种方法来包装来自后端服务器的正文(以及错误),以便它可以作为最终的部分响应。

另一种解决方案是打开另一个 WebSocket 请求来跟踪上传/下载过程。 socket.io 是一个很好的 node 库。

【讨论】:

  • 谢谢。第一个链接让我找到了第一部分的解决方案。所以我需要把它看作两部分,这是有道理的。我将查看 socket.io。
  • 这个比其他的好多了,只是缺少链接中与答案相关的内容。
【解决方案2】:

第一部分的解决方案在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);

【讨论】:

  • 虽然你实现的逻辑是正确的,但这不是一个正确的答案,因为你在服务器上console.loging它。操作员希望它在浏览器中。 :)
  • 啊,虽然我是 OP,但你有点正确。但我声明这将是我问题第一部分的解决方案。我这样做对吗? :)
  • 来吧,@Riel 是 OP。而且我很确定他或她会在找到正确的方法来做服务器到客户端的进度报告后改进答案。 ;-)
  • @Riël 我正在尝试获取请求的 bytesWritten,但我只获得了 FormData 的总大小...我不知道我做错了什么...也尝试过_bytesDispatched 和相同的......你知道可能是什么问题吗?我正在上传一个表单数据文件(二进制)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
  • 2021-05-10
  • 2017-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多