我正在尝试使用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();
});
这是终端内的内容
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();
,程序将永远继续。
如果我取消注释process.exit();
行,程序会立即终止而不解析任何内容。但是,如果我将此行放入变换器的完成事件中,程序将在info: Transformer finish
之后退出,而不是最后两行。
我想知道如何以及在哪里放置process.exit();
退出程序以确保我的CSV文件的所有用户都是在数据库中创建的。
答案 0 :(得分:0)
首先,不要尝试在发生错误时使用Process exit,使用throws new Error。阅读更多here。 关于你的问题:第二件事你有一个异步函数,并把你的退出程序命令从异步函数体中取出,所以它使你的第二个问题,为你的第一个问题,当一切都将完成时退出,你应该改变你的异步函数first.to like this:
.on('finish', () => {sails.log.info('Transformer finish');process.exit(1);})