停止http-stream

时间:2015-05-25 06:05:20

标签: node.js node-webkit

这样做的目的是在node-webkit下载一个正在进行的mp3流的部分,一个'剪辑',所以我必须能够在任意点停止下载而不是消费一个合适的档案。

首先,我必须了解nwjs如何下载流,我在这里找到了示例代码: http://sebastiandelgado.info/node-streams-for-node-webkit-apps/

我添加第17到21行作为测试,看看我是否可以下载任意数量的字节并播放文件。

这很有用,但是我得到了一个解析错误,因为on-data仍在尝试写入我已经关闭的文件流,所以我在第25行添加了一个标志并修复了错误。

剩下的一个问题是停止http流,我需要关闭连接,所以我做了更多阅读。

我查看了http.get()的文档,并被引导到http.response(): https://nodejs.org/docs/latest/api/http.html

这反过来又导致我收到消息: https://nodejs.org/docs/latest/api/http.html#http_http_incomingmessage

" ...它实现了Readable Stream接口,以及以下附加事件,方法和属性。 事件:'关闭'# function(){} ......"

所以我在第19行试了一下。

那个-did-工作,http连接停止流式传输,但是,它也发出错误:

Uncaught TypeError: undefined is not a function
events.js:125 Uncaught Error: Parse Error

代码有效,mp3下载和http-stream停止,没有任何不利影响......但我想知道如何修复错误。

我使用nwjs 0.12.0,它使用了node.js的io.js fork,对结果感到满意,到目前为止。

NWEXE=path-to-nw.exe

01 function dlstream () 
02 {  
03 
04  var http = require('http');  
05  var fs   = require('fs');
06  var flag = true; 
07  
08  var req = http.get('http://streams1.kpfa.org:8000/kpfa_64', function(res) {
09         
10          var bytesDownloaded = 0;
11          var fileName        = 'Download.mp3';
12          var writeStream     = fs.createWriteStream(NWEXE + '/' + fileName);
13              
14          res.on('data', function(data) {
15                 
16              //test to arbitrarily end download/close http-stream
17              if(bytesDownloaded > (1024*16)){
18                 writeStream.end();        //close file stream
19                 req.close();              //close http connection
                   //ans: use req.destroy() instead of req.close()
20                 flag=false;               //set closed flag
21              }
22              bytesDownloaded += data.length;
23                 
24              //flag so we don't write to a closed file-stream
25              if(flag){
26                 writeStream.write(data);
27              }
28         });
29    });
30 }

1 个答案:

答案 0 :(得分:0)

好的,答案是req.close(),我不得不使用req.destroy()。

停止可读流而不抛出错误。