2016-12-20 2 views
0

CLI에서 node.js를 사용하여 CSV 파일에서 사용자를 가져 오려고합니다.파이프 완료시 프로세스 종료

그러나 모든 작업이 완료되면 프로그램을 올바르게 종료하는 방법을 알지 못합니다. 여기

여기

"use strict"; 

const Sails = require('sails');  
const fs  = require('fs'); 
const csv  = require('csv'); 
const filename = './test.csv'; 

Sails.load({ 
    models : { migrate : 'safe'}, 
    log : { level : 'info' }, 
    hooks : { grunt : false, sockets : false, pubsub : false }, 
}, (errSails, sails) => { 

    if (errSails) process.exit(1); 

    let input = fs.createReadStream(filename); 
    let parser = csv.parse(); 
    let transformer = csv.transform((record) => { 
    sails.log.debug('record : ', record); 
    sails.log.info('Transformer : searching user...'); 
    return User.findOne({email: record.email}) 
    .then((user) => { 
     sails.log.info('Transformer : search complete'); 
     if (!user) { 
     sails.log.info('Transformer : no users found'); 
     return User.create(record); 
     } 
     return record; 
    }) 
    .catch((err) => sails.log.error(err)); 
    }); 

    parser 
    .on('readable',() => sails.log.info('Parser readable')) 
    .on('finish',() => sails.log.info('Parser finish')) 
    .on('error', (err) => sails.log.error('Parser error : ', err)); 

    transformer 
    .on('finish',() => sails.log.info('Transformer finish')) 
    .on('error', (err) => sails.log.error('Transformer error : ', err)); 

    input.pipe(parser).pipe(transformer).pipe(process.stdout); 

    //--- Exit program 
    // process.exit(); 
}); 

Sails.jsnode-csv를 사용하여 내 코드가 process.exit();없이 터미널

debug: record : { ... } 
info: Transformer : searching user... 
info: Parser readable 
info: Parser finish 
info: Transformer finish 
info: Transformer : search complete 
info: Transformer : no users found 

안에 무엇인가, 프로그램은 영원히 계속합니다.

process.exit(); 행의 주석을 제거하면 프로그램은 아무 것도 해석하지 않고 즉시 종료됩니다. 그러나이 라인을 변압기의 종료 이벤트에 넣으면 마지막 두 라인없이 info: Transformer finish 다음에 프로그램이 종료됩니다.

process.exit();을 어떻게 종료해야 프로그램을 종료해야 내 CSV 파일의 모든 사용자가 데이터베이스에 만들어 졌는지 확인할 수 있습니다.

답변

0

먼저 사용자에게 오류가 발생하면 프로세스 종료를 시도하지 말고 use는 새로운 오류를 throw합니다. 더 많은 것을 읽으십시오 here. 및 문제 : 두 번째로 비동기 함수가 있고 비동기 함수 본문에서 exit 프로그램 명령을 두 번째로 내리면 두 번째 문제가 발생합니다. 첫 번째 문제는 모든 것이 끝나면 끝내기 위해 변경해야합니다. 먼저 비동기 기능을 다음과 같이 변경하십시오.

.on('finish',() => {sails.log.info('Transformer finish');process.exit(1);}) 
+0

이것은 데모 코드입니다. 무슨 일이 일어나고 있는지를 이해하기위한 로그 만 보여줍니다. 물론 내 코드는'error' 이벤트에 에러를 던집니다. 그리고 나는'process.exit (1);'을'finish' 이벤트에 넣으면 변압기가 비동기 처리를 끝내지 않아도 코드가 멈춘다 고 말했습니다. – Martial

+0

나는 당신의 코드를 꽤 잘 보았다. finish 이벤트에 process.exits를 추가하려고 시도 했습니까? –

+0

그래, 그랬지. 만약 그렇다면,'User.findOne ({email : record.email}). 그때 ((사용자) => {/ * 여기 * /});)의 모든 것은 Transformer의' 'finish' 이벤트가'csv.transform()'에서 비동기 처리가 완료되기 전에 호출됩니다. – Martial