2016-04-10 22 views
0

我是的新手,我正在使用this library连接到CasparCG server(TCP连接)。现在,我试图创建一些类型的错误处理,并且我有两个部分的问题。TCP连接丢失后的Node.js头部错误

我连接正常,我的用户界面显示连接已建立。然后出于测试目的,我重新启动服务器导致连接丢失。我在我的控制台得到这个消息:

_http_outgoing.js:335 
throw new Error('Can\'t set headers after they are sent.'); 
    ^
Error: Can't set headers after they are sent. 
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:335:11) 
at ServerResponse.header (C:\www\node- test\node_modules\express\lib\response.js:718:10) 
at ServerResponse.send (C:\www\node-test\node_modules\express\lib\response.js:163:12) 
at ServerResponse.json (C:\www\node-test\node_modules\express\lib\response.js:249:15) 
at null.<anonymous> (C:\www\node-test\api\caspar.js:33:44) 
at emit (events.js:104:17) 
at Socket.<anonymous> (C:\www\node-test\node_modules\caspar-cg\lib\connection.js:60:9) 
at Socket.emit (events.js:129:20) 
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:991:10) 
Program node server.js exited with code 1 

路线:

var CasparCG = require('caspar-cg'); 
var ccg = new CasparCG("192.168.1.100", 5250); 

var _cg_connected = false; 

ccg.on('connected', function() { 
    _cg_connected = true; 
}); 

ccg.on('error', function (error) { 
    _cg_connected = false; 
    console.log(error); 
}); 

ccg.on('connectionError', function (error) { 
    _cg_connected = false; 
    console.log(error); 
}); 

ccg.on('end', function() { 
    _cg_connected = false; 
    console.log('Connection ended'); 
}); 

ccg.on('close', function() { 
    _cg_connected = false; 
    console.log('Connection closed'); 
}); 

module.exports = function(router, connection) { 
router.post('/casparcg/connect', function(req, res) { 
    if(_cg_connected) { 
     return res.status(200).json({success: true, message: 'Connection already established'}); 
    } 

    ccg.connect(function() { 
     if(_cg_connected) { 
      return res.status(200).json({success: true, message: 'Connection established'}); 
     } else { 
      return res.status(503).json({success: false, message: 'Connection failed'}); 
     } 
    }); 
}); 

}

现在我怎样才能真正抓住这个“连接丢失”错误或任何没有它导致崩溃并重新启动?

我的第二个问题:

我的应用程序使用的node.js在AngularJS前的REST API。我可以为AngularJS创建一些类型的侦听器,它捕获node.js发送一条消息“我们失去了连接,让你知道”,AngularJS可以适当调整,这意味着我可以关闭变量connection = false并相应地设置按钮。

编辑:

发现代码中的一个错误。移动路由器外部的侦听器上的所有TCP,只留下连接(回调)。它现在会在重新启动时自动重新连接,但会在完全断开连接时记录一个错误。

回答

0

你的代码执行以下操作:

  • 处理POST请求/casparcg/connect
  • 您的处理程序中,你分钟后建立新的连接,反应可能随时间发生的各种事件(也许
  • 但HTTP请求都可以回答最初的请求)只有一次
  • 当你的代码完成初始connect事件运行时,它会回复POST请求200个状态码
  • 之后,当收到事件(如错误)时,它将尝试再次回答同一请求再次 ...由于“头文件已被发送”(即客户端早已离开),这将不起作用。

所以这个问题是逻辑的问题之一。您正在尝试建立长时间运行的请求(以检测断开连接),但您建立连接时请求回答 ...您无法改变主意并在稍后发送“oops已断开连接”,因为回复已经存在发送。

另外,建立一个新的连接可能是一个坏主意,只是为了检测连接的下降......我猜,你的应用需要另外一个连接来做它真正的事情。

如果你真的需要一个“会话/连接设计”,然后切换到WebSockets,Ajax/REST不会削减它。Websocket允许建立连接的状态设计可以在两侧进行监控,并且可以以任意顺序在客户端和服务器之间发送任意数量的消息。 如果你不想使用WebSockets,你最终会实现一个穷人的的WebSockets反正...

此外,我不知道是什么ccg是,但它看起来像你连接到它不带参数。 ..因此,连接并不取决于连接的用户......也许您可以为所有用户建立单一连接?或者使用n连接池服务N客户端,其中n < N ...并避免浪费连接和连接延迟...

+0

您是对的。我实际上调整了将.on()函数移动到路由之外的代码,因为它们不需要“重新建立”。连接路由现在只会尝试连接,如果连接已经连接,则返回true。它现在在重新启动时重新连接,并且在关闭服务器时不会崩溃。它记录一个超时,但我可以以某种方式捕获并发送给Angular? – Rcls

+0

可以以某种方式捕获并将其发送给Angular? 你可以用websockets ... –

+0

是的,谢谢!这实际上是解决方案。我已经开始工作了。 – Rcls