管道完成后退出过程

时间:2016-12-20 10:20:01

标签: node.js sails.js

我正在尝试使用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();
});

这是终端内的内容

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文件的所有用户都是在数据库中创建的。

1 个答案:

答案 0 :(得分:0)

首先,不要尝试在发生错误时使用Process exit,使用throws new Error。阅读更多here。 关于你的问题:第二件事你有一个异步函数,并把你的退出程序命令从异步函数体中取出,所以它使你的第二个问题,为你的第一个问题,当一切都将完成时退出,你应该改变你的异步函数first.to like this:

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