2016-12-20 4 views
0

Ich versuche, Benutzer aus einer CSV-Datei mit node.js in CLI zu importieren.Prozess beenden, wenn die Pipe fertig ist

Aber ich weiß nicht, wie Programm ordnungsgemäß zu beenden, wenn alle Aufgaben abgeschlossen sind.

Hier mein Code Sails.js und 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(); 
}); 

Hier ist, was innerhalb des Terminals ist

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

Ohne process.exit(); weiterhin das Programm für immer.

Wenn ich die process.exit(); Zeile Kommentar-, beendet das Programm sofort, ohne etwas parsen. Aber, wenn ich diese Zeile in das Ende-Ereignis des Transformators setzen, wird das Programm nach info: Transformer finish ohne die letzten zwei Zeilen beendet.

Ich möchte wissen, wie und wo ich process.exit(); setzen sollte, um Programm zu beenden, um sicherzustellen, dass alle Benutzer meiner CSV-Datei in der Datenbank erstellt werden.

Antwort

0

Erstens, versuchen Sie nicht zu Benutzerprozessausgang auf Fehler passiert, wirft die Verwendung neuer Fehler. Lesen Sie mehr here. und über Ihr Problem: aus Asynchron-Funktion Körper die zweite Sache, die Sie haben eine Funktion Asynchron und Ihre Exit-Programm Befehl setzen, so macht es Ihr zweites Problem, für das erste Problem, Ausgang zu machen, wenn alles getan wird, sollten Sie ändern Ihre asynchrone Funktion zuerst.zu etwas wie diesem:

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

Dies ist ein Demo-Code. Es zeigt nur Logs, um zu verstehen, was passiert. Natürlich wirft mein Code Fehler bei "Fehler" -Ereignissen. Und ich sagte, dass, wenn ich das 'process.exit (1);' in das 'finish'-Ereignis setze, der Code stoppt, selbst wenn der Transformator die Async-Behandlung nicht beendet hat. – Martial

+0

Ich sehe, dein Code ist ziemlich gut. Hast du versucht, ein Prozess.exits für dein Ziel-Event hinzuzufügen? ja –

+0

das ist, was ich tat, aber wenn ich es tue, alles in 'User.findOne ({E-Mail: record.email}). dann ((Benutzer) => {/ * hier * /});' nicht, weil Transformer ausgeführt ' finish'-Ereignis wird aufgerufen, bevor die asynchrone Behandlung in 'csv.transform()' durchgeführt wird. – Martial

Verwandte Themen