2014-12-31 4 views
0

연결이 지속되는 동안 데이터를 URL에 푸시하는 nodej에 Firebase Connection이 있습니다. 닫히면 해당 데이터를 제거하려고합니다. ("hey I 'm here") 기본적으로 http://web-f6176e84-c073-416f-93af-62a9a9fbfabd.runnable.comNodeJS를 닫는 동안 작업 수행

, 명중 "Ctrl + C"하고 "참조를 제거하는"출력합니다 : 내가 떠날 때, 텍스트

나는 그것의 예를 보여줍니다는 "실행 가능한"이 만든) 사라 그러나 실제로는 데이터를 삭제하지 않습니다. (문서에서는 remove()가 기본적으로 데이터를 null로 설정하는 set (null)과 동일하다고 말하고 null이기 때문에 전체 요소가 사라져야합니다.)

그러나 데이터를 제거하지 않고 있어도 데이터가 사라지는 것을 보지 못합니다. (나는 임시 URL을 사용하고 있습니다. 이 URL이 존재하지 않으면에 액세스 할 수있는 URL로 복제 할 수 있어야합니다.)

이것은 내가 사용하고있는 코드입니다.

var FB_URL = 'https://cuhiqgro1t3.firebaseio-demo.com/test_code'; 
var Firebase = require('firebase'); 
var myRootRef = new Firebase(FB_URL); 
console.log("created Firebase URL"); 
process.stdin.resume(); //so the program will not close instantly 
function delete_fb_entries() { 
    return function() { 
     console.log("Trying to remove reference"); 
     myRootRef.remove(); 
     process.exit(); 
    } 
} 

//do something when app is closing 
process.on('exit', delete_fb_entries()); 

//catches ctrl+c event 
process.on('SIGINT', delete_fb_entries()); 

//catches uncaught exceptions 
process.on('uncaughtException', delete_fb_entries()); 

편집 :에 관한 추가 정보 "왜"나는 게으른 이니까 내 중포 기지 URL 밖으로 내 로컬 IP 주소를 밀어 그것은 단지 내가 항상 액세스 표시됩니다 수있는 웹 페이지 설정을보다 쉽게 특정 장치의 URL (그리고 라우터 테이블을 사용하는 것이 더 쉽다는 것을 알고 있습니다.), 실제로이 용도로도 다른 목적이 있습니다. (이 내 네트워크에 일 경우, 내 장치에서 특정 장치를 선택할 수 있습니다. 웹 페이지 및 액세스 필요한 데이터, 어느 쪽이든, 그것은 작동하지만, 나는 그것을 제대로 제거 할 수 없습니다,이 한 번에 내가 믿는 시간에 작동하는 데 사용되는, 그래서 난 단지 API가 변경된 또는 뭔가 있다고 가정 할 수 있습니다).

EDIT 2 : 제안 된대로 process.exit()를 제거했는데 실행 가능한 데이터가 문제의 데이터를 삭제 한 것처럼 보였습니다. 로컬 데이터에서 시도했는데 (일부 정리 및 주석 처리 한 후) 데이터를 제거했습니다. ,하지만 Ctrl + C를 누르면 더 이상 프로그램을 종료하지 않습니다 ..... 그래서 예.

"process.exit()"가 현재 필요하거나 불필요한 것인지 알아야합니다.

편집 3 : 좋아, 이제 process.exit (Ctrl + C는 더 이상 프로그램을 종료하지 않고 Ctrl + Z를 눌러 재부팅해야 함)를 사용해야합니다. 나는 그것을 바로 추가하려고했지만 firebase 요소를 제거하는 것이 synchronus 연산이 아니라는 것을 깨달았습니다. 그래서 그것을 닫을 때 (다음 시도) remove 함수에 on complete 처리기를 사용했습니다 (그래서 remove (onComplete) , 그리고 process.exit()를 onComplete 함수에 추가).

그래서 결국은 다음과 같습니다과 내 응용 프로그램

var FB_URL = 'https://cuhiqgro1t3.firebaseio-demo.com/test_code'; 
var Firebase = require('firebase'); 
var myRootRef = new Firebase(FB_URL); 
console.log("created Firebase URL"); 
function onComplete() { 
    process.exit(); 
] 
process.stdin.resume(); //so the program will not close instantly 
function delete_fb_entries() { 
    return function() { 
     console.log("Trying to remove reference"); 
     myRootRef.remove(onComplete); 
    } 
} 

//do something when app is closing 
process.on('exit', delete_fb_entries()); 

//catches ctrl+c event 
process.on('SIGINT', delete_fb_entries()); 

//catches uncaught exceptions 
process.on('uncaughtException', delete_fb_entries()); 

EDIT 4 작동하는 것 같군 : 아래의 의견에 응답, 그래서 나는 다음이 될 수있는 간단한 프로그램을 수정 시도 :

function delete_fb_entries(){ 
    return function() { 
       console.log("I should quit soon"); 
     } 
} 

process.stdin.resume(); //so the program will not close instantly 

//catches ctrl+c event 
process.on('SIGINT', delete_fb_entries()); 

내 프로그램이 종료되지 않았습니다. 이 경우 node가 닫히지 않는 이유를 이해하지 못한다. console.log 다음에 process.exit()를 추가하여 nodej를 종료시킨다. 이것은 비동기 함수가 아니기 때문에이 경우에는 왜 종료되지 않습니까? (이것은 버그입니까, 저의 작동 방법에 대한 오해입니까?)

+1

프로세스가 이미 종료 중입니다. –

+0

한 시점에서 필자는 필자가 필요로하는 인상을 받고 있다고 생각한다. (아마도 부정확 한 예가 될 수도 있고, 설명서를 잘못 이해했을 수도있다. 내가 그 조각을 쓴 이후로 몇 달간). 나는 그것을 제거하려고 할 수있다. – onaclov2000

+0

ok 그래서 함수에서 process.exit()을 제거했습니다. 내 예제에서는 작동하지만 내 로컬 소프트웨어에서는 작동하지 않는 것 같습니다. 이제는 그 중 어떤 작업이 진행되고 있는지 알아 보겠습니다. (내가 추가 코드를 업데이트 할 수도 있습니다. 코드가 더 이상 원래 질문 할 때와 중복되지 않습니다.) – onaclov2000

답변

1

모든 exit 이벤트 처리기가 실행 된 후에 프로세스가 종료되므로 프로세스의 exit 이벤트 처리기에서 비동기 작업을 수행 할 수는 없으며 동기 작업 만 수행 할 수 있습니다. .

+0

그래, 무슨 일이 일어나고있는지는 비동기 코드 조각을 실행했기 때문입니다. 출구 사건, 그리고 내가 그 지점에서 수동으로 빠져 나오지 않으면 기회를 놓치고 빠져 나오지 않을까요? – onaclov2000

+0

당신은 내가 비동기 작전을 수행 할 수 없다고 말하지만 그것은 정확히 내가하고있는 일이며이 시점에서 일하고있다. – onaclov2000

+0

내가 말한 것은 여전히 ​​진실이다. SIGINT를 핸들링하고 올리면 프로세스가 종료되지 않으므로 firebase 요청 *이 시작됩니다. 그러나 이와 같은 것만 포함하는 스크립트는 작동하지 않습니다. 'process.on ('exit ', function() {require ('http ') .get ('http : //google.com',function (res) {console .log ('saw 응답')})})'. – mscdex

관련 문제