大きなxmlファイルを読むためにsax-jsを使用しています。パーサーが終了したときにプログラムを終了させることができません。パーサー ロジックを削除したスクリプトの形状を次に示します。
var fs = require('fs');
var sax = require('sax');
var feedFile = 'foo.xml';
var saxStream = sax.createStream(true)
.on('opentag', function(node) { // do stuff })
.on('end', function() {
console.log("parser end event");
});
var options = {
flags: 'r',
encoding: 'utf8',
mode: 0666,
bufferSize: 1024
};
fs.createReadStream(feedFile, options, function(err) {
throw err;
})
.on('end', function() {
console.log("read stream end event");
})
.pipe(saxStream);
すべてが正常に機能します。そしてコンソールはこのようなメッセージを受け取ります
read stream end event
parser end event
そして、プロセスは終了するはずです。そうではありません。私は何が欠けていますか?
編集:私が欠けているもの。 リソースがまだ開いているため、ノードを終了できませんでした。誘惑は、どこでも、どこでも process.exit() を呼び出そうとすることです。この場合、私は自分で試してみましたが、うまくいきませんでした。
開いているmongodb接続(mongooseによって管理されている)があるため、スクリプトを終了できませんでした。これは本質的に(詳細ではありませんが)それを修正したものです:
saxStream.on('end', function() {
console.log("parser end event");
mongoose.disconnect();
};