2012-12-29 3 views
0

나는 웹 기반 프론트 엔드 을 사용하여 컨트롤러/통신 응용 프로그램을 작성했으며 node.js (0.8.15)을 사용했습니다. socket.io은 정기적 인 데이터 교환을 수행합니다.node.js 스크립트 블록 (비글 본)

필자의 백엔드는 매초 3 개의 임베디드 보드와 (rs232에서 19200bps로) 통신해야합니다. 이 보드는 통신 장애가 더 길어지면 워치 독을 트리거합니다.

node.js 앱을 시작하면 모든 것이 정상입니다. 통신이 작동합니다. 내 웹 서버에 연결되면 즉시 시간에 대한 이 표시됩니다. rs232 통신이 약 5-10 초 동안 중지 된 것을 볼 수 있습니다.

웹 페이지를 다시로드 할 때이 효과가 나타나지 않습니다. http 또는 https를 사용하면 아무런 효과가 없습니다. 또는 --noalways_full_compiler 아무것도 변경되지 않습니다 --noopt --nolazy 또는 같은 옵션 노드를 실행하려고 . 여기

내 웹 서버의 관련 부분입니다 : 하나의 웹 서버에 대한 와 시리얼 통신을위한 하나

var requests = 
[ { method: 'GET', pattern: '/',    type: 'text/html', subst: '/index.html' }, 
    { method: 'GET', pattern: '/index.html',  type: 'text/html' }, 
    { method: 'GET', pattern: '/favicon.ico', type: 'image/x-icon' }, 
    { method: 'GET', pattern: '/js/[^/]+\.js', type: 'text/javascript' }, 
    { method: 'GET', pattern: '/css/[^/]+\.css', type: 'text/css' }, 
    { method: 'GET', pattern: '/img/[^/]+\.jpg', type: 'image/jpeg' }, 
    { method: 'GET', pattern: '/img/[^/]+.png', type: 'image/png' }, 
]; 

function response (req, res) 
{ 
    var method = req.method; 
    var path = Path.normalize (Url.parse (req.url).pathname); 

    console.log (method+' '+path); 
    for (i = -1; ++i < requests.length;) 
    { 
    var r = requests[i]; 
    if (r.method == method && path.search ('^'+r.pattern+'$') == 0) 
    { 
     if ('subst' in r) 
     { 
     path = r.subst; 
     }; 
     if (r.type.match (/^text/)) 
     { 
     Fs.readFile (__dirname+path, 'utf8', function (err, data) 
     { 
      if (err) 
      { 
      res.writeHead (500); 
      res.end ('Error reading '+path); 
      } 
      else 
      { 
      res.writeHead (200, {'Content-Type': r.type}); 
      res.end (data, 'utf8'); 
      } 
     }); 
     return; 
     } 
     else 
     { 
     Fs.readFile (__dirname+path, function (err, data) 
     { 
      if (err) 
      { 
      res.writeHead (500); 
      res.end ('Error reading '+path); 
      } 
      else 
      { 
      res.writeHead (200, {'Content-Type': r.type}); 
      res.end (data); 
      } 
     }); 
     return; 
     } 
    } 
    }; 
    console.log ('error 404'); 
    res.writeHead (404); 
    res.end(); 
} 

var httpServer = Http.createServer (response); 
httpServer.listen (47080); 
console.log ('http server running at port 47080'); 
var basic = Auth ({ 
    authRealm : "controller", 
    authFile : __dirname + '/users.htpasswd' 
}); 

function httpsResponse (req, res) 
{ 
    basic.apply (req, res, function (username) 
    { 
    response (req, res); 
    }); 
} 

var options = { 
    key: Fs.readFileSync (__dirname + '/controller.pem'), 
    cert: Fs.readFileSync (__dirname + '/controller.cert') 
}; 
var httpsServer = Https.createServer (options, httpsResponse); 

httpsServer.listen(47443); 
console.log ('https server running at port 47443'); 

function connected (socket) 
{ 
    console.log ('Listener connected'); 
    theApp.addSocket (socket); 
    socket.on ('disconnect', function() 
    { 
    theApp.removeSocket (socket); 
    }); 
} 

var httpListen = Io.listen (httpServer, { 'log level':1 }); 
var httpsListen = Io.listen (httpsServer, { 'log level':1 }); 
httpListen.sockets.on ('connection', connected); 
httpsListen.sockets.on ('connection', connected); 
+0

이 코드 스 니펫에는 몇 가지 문제가 있습니다. 우선, 가장 중요한 것은 틀림없이, 이집트 중괄호 및 함수 주위의 간격과 같은 노드 규칙을 따르지 않는 것입니다. 일부 팁을 보려면 [여기] (http://nodeguide.com/style.html)를보십시오. – qubyte

+1

'var'가없는 변수 'i'가 훨씬 더 중요하므로 전역 적으로 할당 (또는 업데이트)됩니다. 첫 번째'for' 루프의 증가분은 두 번째보다는 세 번째 위치에 있어야합니다. 블록 중 일부에는 세미콜론이 오는데 거기에는 없어야합니다. 소켓 단절 이벤트는 아마도'on'보다는'once'로 처리되어야합니다. '요청'이 무엇인지 확실하지 않습니다. 이게 뭐야? – qubyte

+0

요청을 추가했습니다 (위 참조). – user1728219

답변

0

나는 두 개의 프로세스로 내 응용 프로그램을 다시 썼다. 개선 된 사항이 있지만 문제를 해결하지 못했습니다.

실제 문제는 가비지 수집기 인 것 같습니다.

--expose-gc를 사용하여 노드를 시작한 후 glob35c를 정기적으로 호출하면 응용 프로그램이 부드럽게 실행됩니다.

+0

나는이 대답을 받아 들일 수 있다고 생각합니까? – hlovdal