Nodejs请求代理stream(mjpeg)连接永远不会结束

(不必要的背景)我有一个nodejs服务器与expressjs框架,代理stream媒体摄像头饲料。 我需要这个的原因是因为复杂的CORS问题,mjpgstream必须来自这个服务器。

//proxy from webcam server to avoid CORS complaining app.get('/stream1',function(req,res){ var url="http://camera.nton.lviv.ua/mjpg/video.mjpg" request(url).pipe(res); }); 

问题:这个问题很简单。 request(url).pipe(res)永远不会closures,因为源文件是从未结束的mjpeg。 当客户端(浏览器;目的地)不再可用时,我需要find强制closures此pipe道的方法,如closures窗口。

在这里输入图像描述

使用socket.io来监视远程连接

 // install it on your project npm install socket.io // require it on server side var socket = require('socket.io'); // listen for sockets from your server var mysocks = socket.listen(myexpressappvar); // keep collection of sockets for use if needed // its good practice var connectedSockets = []; // add event handelers on server side mysocks.sockets.on("connection", function(socket){ // add socket to our collection connectedSockets.push(socket); // you will need to bind their stream id here. exe..... // listen for disconnected socket.on("disconnect", function(){ // remove socket from collection connections.splice(connections.indexOf(socket), 1); // destory stream here exe... }); }); // last thing, is add socket.io to the client side. <script src="/socket.io/socket.io.js"></script> // then call connect from client side js file var socket = io.connect(); 

我find了一个更简单的方法。 为客户端连接closures添加事件侦听器,并在发生时强制closurespipe道。

 app.get('/stream1',function(req,res){ var url="http://camera.nton.lviv.ua/mjpg/video.mjpg" var pipe=request(url).pipe(res); pipe.on('error', function(){ console.log('error handling is needed because pipe will break once pipe.end() is called') } //client quit normally req.on('end', function(){ pipe.end(); } //client quit unexpectedly req.on('close', function(){ pipe.end(); } }); 

其他答案不适合我。 这一行var pipe = request(url).pipe(res); 返回pipe道而不是请求对象。 所以我需要打破这个阵容。

请求对象需要中止。 调用.end()也不起作用,但是.abort()却做到了这一点。 我花了几个小时才find对我有用的答案,所以我想我会分享。

  app.get('/cam/frontdoor',function(req,res){ var request_options = { auth: { user: '', pass: ''}, url: 'http:/xx.xx.xx.xx/mjpg/video.mjpg', }; var req_pipe = request(request_options); req_pipe.pipe(res); req_pipe.on('error', function(e){ console.log(e) }); //client quit normally req.on('end', function(){ console.log('end'); req_pipe.abort(); }); //client quit unexpectedly req.on('close', function(){ console.log('close'); req_pipe.abort() }) })