2016-12-20 11 views
0

CLIでnode.jsを使用してCSVファイルからユーザーをインポートしようとしています。パイプの終了時にプロセスを終了します

しかし、すべてのタスクが完了したら、プログラムを正しく終了する方法がわかりません。ここでSails.jsnode-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(); 
}); 

を使用してここで

私のコードは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();行のコメントを外すと、プログラムは何も解析せずにすぐに終了します。しかし、私がこのラインを変圧器の仕上げイベントに入れると、プログラムは最後の2ラインを除いてinfo: Transformer finishの後に終了します。

process.exit();は、CSVファイルのすべてのユーザーがデータベースに作成されるように、プログラムを終了する方法と場所を知りたいと思っています。

答えて

0

まず、エラーが発生したときにプロセス終了を試行しないでください。useは新しいエラーをスローします。続きを読むhere。 あなたの問題について:非同期関数を持っていて、非同期関数本体から出口プログラムコマンドを出してしまう2番目のことは、2番目の問題です。最初の問題は、すべてが完了したら終了するようにしてください。あなたの非同期機能first.toこのようなもの:

.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})のすべてがthen((user)=> {/ * here * /});' 'finish'イベントが' csv.transform() 'で非同期処理が行われる前に呼び出されます。 – Martial

関連する問題