('end',…)永远不会被解雇

我试图将一些audiostream到我的服务器,然后将其stream式传输到用户指定的服务,用户将向我提供someHostName ,有时可能不支持该types的请求。

我的问题是,当发生clientRequest.on('end',..)永远不会被解雇的时候,我想这是因为它被传递给someHostReq ,当someHostName是“错误”的时候会被搞砸。

我的问题是:

有没有反正我仍然可以有clientRequest.on('end',..)甚至当streamclientRequestpipe道发生了什么问题呢?

如果不是的话:我该如何检测someHostReq “马上”发生了什么错误? someHostReq.on('error')不会启动,除非一段时间。

码:

  someHostName = 'somexample.com' function checkIfPaused(request){//every 1 second check .isPaused console.log(request.isPaused()+'>>>>'); setTimeout(function(){checkIfPaused(request)},1000); } router.post('/', function (clientRequest, clientResponse) { clientRequest.on('data', function (chunk) { console.log('pushing data'); }); clientRequest.on('end', function () {//when done streaming audio console.log('im at the end'); }); //end clientRequest.on('end',) options = { hostname: someHostName, method: 'POST', headers: {'Transfer-Encoding': 'chunked'} }; var someHostReq = http.request(options, function(res){ var data = '' someHostReq.on('data',function(chunk){data+=chunk;}); someHostReq.on('end',function(){ console.log('someHostReq.end is called'); }); }); clientRequest.pipe(someHostReq); checkIfPaused(clientRequest); }); 

输出:

在正确的主机名的情况下:

  pushing data . . pushing data false>>> pushing data . . pushing data pushing data false>>> pushing data . . pushing data console.log('im at the end'); true>>> //continues to be true, that's fine 

在主机名错误的情况下:

  pushing data . . pushing data false>>>> pushing data . . pushing data pushing data false>>>> pushing data . . pushing data true>>>> true>>>> true>>>> //it stays true and clientRequest.on('end') is never called //even tho the client is still streaming data, no more "pushing data" appears 

如果你认为我的问题是重复的:

  • 它不是这样: node.js http.request事件stream – 我的END事件去了哪里? ,OP只是做了一个GET而不是POST

  • 它不是这样的: 我在node.js中的http.createserver不起作用? ,stream处于暂停模式,因为没有发生以下情况:

您可以通过执行以下任一操作切换到stream动模式:

添加“数据”事件处理程序来侦听数据。

调用resume()方法显式打开stream。

调用pipe()方法将数据发送到Writable。

来源: https : //nodejs.org/api/stream.html#stream_class_stream_readable

  • 它不是这样的: Node.js响应来自http请求不调用'end'事件,而不包括'data'事件 ,他只是忘了添加.on('data',..)

如果主机名错误,行为似乎是缓冲区的问题,如果目标stream缓冲区已满(因为someHost没有获取发送的数据块),pipe道将不会继续读取源stream,因为pipe道自动pipe理stream。 由于pipe道不读取原始stream,所以永远不会到达“结束”事件。

有没有反正我仍然可以有clientRequest.on('结束',..)甚至当streamclientRequestpipe道发生了什么问题呢?

除非数据完全消耗,否则“结束”事件不会触发。 要使用暂停的stream来触发“结束”,您需要调用resume() (先从错误的主机名中先移除,或者再次陷入缓冲区中),再次将stream设置为flowMode,或者将read()移到最后。

但是,如何检测什么时候应该做上述任何一项?

someHostReq.on('错误')是自然的地方,但如果启动时间太长,

首先尝试设置一个低超时请求(小于someHostReq.on('错误')需要触发,因为似乎你太多的时间) request.setTimeout(timeout[, callback])并检查它是否没有失败时正确的主机名。 如果工作,只需使用callbacktimeout事件来检测服务器的timeout ,并使用上述技术之一达到最后。

如果timeOut解决scheme失败或不符合你的要求,你必须在clientRequest.on('data')clientRequest.on('end')和/或clienteRequest.isPaused来猜测你什么时候被缓冲区。 当你觉得自己被困住了,只需要应用上面的一种技巧来达到stream的末尾。 幸运的是,检测缓冲区卡住的时间要less于等待someHostReq.on('error') (也许两个request.isPaused() = true没有达到' data'事件就足以确定是否卡住了)。

如何检测someHostReq“立即”发生了什么错误? someHostReq.on('错误')不会启动,除非一段时间。

触发器触发错误。 你不能“立即”检测到它。 ¿为什么不只是发送一个certificate灯塔的请求来检查pipe道stream之前的支持? 一些:

“用户指定的检查服务…” If确定 – >pipe道用户请求stream服务OR失败 – >通知用户错误的服务。