nodejs中的模块请求不会停止管道

时间:2014-10-08 03:31:20

标签: node.js request

我使用dicer来解析request的管道,但我不知道哪个命令用于停止管道。

dicer.on('part', function(part) {
    var frameEncoded = '';
    part.setEncoding('base64');

    part.on('header', function(header) { });
    part.on('data', function(data) { frameEncoded += data; });
    part.on('end', function() { console.log(frameEncoded); });
});

  var options = {
    method: 'GET',
    uri: 'http://192.168.1.2/video.mjpeg/'
  }
  request(options).pipe(dicer)

 //only for test

setTimeout(function() {
  console.log('stop request.pipe');
  var options = {
    method: 'GET',
    uri: 'http://192.168.1.2/video.mjpeg/'
  }
  request(options).end() //<-- ?? which command?? This not work...
}, 5000);

uri指向ipcamera流并且不可能抓住事件连接请求关闭,因为流是无限的。

2 个答案:

答案 0 :(得分:1)

访问请求的底层套接字的一种方法是侦听请求对象上的socket事件。然后,这只是关闭该套接字的问题。例如:

var req = request(options);
req.on('socket', function(sock) {
  setTimeout(function() {
    console.log('stop request.pipe');
    sock.end(); // or sock.destroy();
  }, 5000);
});
req.pipe(dicer);

请注意,在发出socket事件时,请求可能尚未启动。 socket事件基本上让您知道已经分配了一个套接字用于请求(当您使用maxSockets设置为某个有限值的http代理时,这尤其有用,这样您就可以不一定得马上分配一个套接字。)

您也可以尝试:

var req = request(options);
req.on('response', function(res) {
  setTimeout(function() {
    console.log('stop request.pipe');
    res.socket.end(); // or res.socket.destroy();
  }, 5000);
});
req.pipe(dicer);

答案 1 :(得分:0)

@ mscdex的方法对我有用。这是代码: -

   request("https://www.linkedin.com/afhdjalsdjhdks")
      .on("error", function (error) { process.stderr.write(error.code) })
      .on("response", function (resp) {
         if ((resp.statusCode !== 200) && (resp.statusCode !== 201)) {
            process.stderr.write(format("%s - %s", resp.statusCode, resp.statusMessage))
            resp.socket.destroy()
         }
      })
      // .pipe(StreamAll())
      .pipe(process.stdout)