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.
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
Ich sehe, dein Code ist ziemlich gut. Hast du versucht, ein Prozess.exits für dein Ziel-Event hinzuzufügen? ja –
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