2013-11-20 2 views
3

노드 JS를 사용하여 Windows 서비스를 설치하기위한 명령 줄 도구를 작성하고 있습니다. 비동기 작업을 한 번 실행 한 후에 내 도구는 성공 메시지를 출력 한 다음 종료해야합니다. 그러나 때로는 성공 메시지를 인쇄하고 종료하지 않습니다.내 명령이 종료되지 않는 이유는 무엇입니까?

노드의 내부 이벤트 루프에서 대기중인 것을 볼 수있는 방법이 있습니까? 그렇다면 내 도구가 무엇을 종료하지 못하게 할 수 있는지 확인할 수 있습니까?

+1

'process.exit()'를 사용하여 종료 하시겠습니까? ** 비동기 ** 작업 (오류, ...)에서 모든 사례를 처리합니까? (종종 문제의 기원입니다.) – Etienne

답변

4

CLI 응용 프로그램에서 가장 일반적인 원인은 프로세스를 활성 상태로 유지하는 이벤트 리스너입니다. 비록 분명히 당신의 코드를 보지 않고 당신에게 관련이 있는지 말할 수 없습니다.

좀 더 일반적인 질문에 답하기 위해 이벤트 루프에서 모든 미해결 된 작업을 볼 수있는 직접적인 방법이 있다고는 생각하지 않습니다. 적어도 JS 토지는 아닙니다. 그러나 process._getActiveHandles()process._getActiveRequests()과 매우 가까워 질 수 있습니다.

그래도 실제로 설명서를 찾는 것이 좋습니다. 네가 찾을 수 없으니. 그들은 서류 미비입니다. 그리고 그들은 밑줄로 시작합니다. 당신 자신의 위험 부담으로 사용하십시오. :)

+0

감사합니다.이 함수들은 바른 행에 있지만 출력은 여전히 ​​불투명합니다. 어떤 모듈이 핸들을 소유하고 있는지 또는 이벤트 리스너가 연결되어 있는지 확인하는 방법이 있습니까? –

+0

불행히도 나는 그 정보를 어떻게 얻을지 모르겠다. 출력물이 확실히 불투명 한 동안 적어도 단서를 찾을 수 있습니다. 예를 들어,'_connectionKey : '4 : 0.0.0.0 : 3000''과 같은 것을 보게되면, 어딘가에 여전히 실행중인 서버가 있다는 것을 알게 될 것입니다. 꽤 이상에서 멀리; 유용하게 등록하는 것조차 거의하지 않습니다. 현실적으로 이것은 옳은 일을하기 위해 코드를 신뢰해야 할 필요가있는 상황입니다. 나는이 문제를 산발적으로 당신의 질문이 제안한 것처럼 보지 못했다. 항상 쉽게 재현 할 수 있습니다. – jmar777

1

워크 플로를 명확히하기 위해 몇 가지 도구를 사용하려고 - 예를 들어, https://github.com/caolan/async#waterfall 또는

https://github.com/caolan/async#eachseriesarr-iterator-callback 그래서, 당신은 전화 콜백을 잃지 않고 명령을 실행하는 동안 슬로우하는 오류를 잡을 수 있습니다.

이 오류가 발생하는 일부 코드 샘플을 제공해야한다고 생각합니다.

+0

문제의 코드에 더 이상 액세스 할 수 없지만 일반적인 경우 Node의 이벤트 루프에서 대기중인 것을 보는 방법에 대한 대답에 관심이 있습니다. –

관련 문제