CLIでnode.jsを使用してCSVファイルからユーザーをインポートしようとしています。パイプの終了時にプロセスを終了します
しかし、すべてのタスクが完了したら、プログラムを正しく終了する方法がわかりません。ここでSails.jsとnode-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ファイルのすべてのユーザーがデータベースに作成されるように、プログラムを終了する方法と場所を知りたいと思っています。
これはデモコードです。何が起きているのかを理解するためのログを表示するだけです。もちろん、私のコードは 'error'イベントにエラーを投げます。そして私は、 'process.exit(1);'を 'finish'イベントに入れると、トランスフォーマーが非同期処理を終了しなくてもコードが停止すると言いました。 – Martial
あなたのコードはかなり良いです。 finishイベントにprocess.exitsを追加しようとしましたか? –
それは私がしたことですが、もしそうであれば、 'User.findOne({email:record.email})のすべてがthen((user)=> {/ * here * /});' 'finish'イベントが' csv.transform() 'で非同期処理が行われる前に呼び出されます。 – Martial