节点加载例程完成后 mongodb 集合中的文档 "disappearing"

Documents "disappearing" from mongodb collection after node loading routine is finished

作为 mongodb 和节点的新手,这个特殊问题简直让我发疯:

我写了一个小模块,它读取一个 .csv 文件,把它变成一个 JSON 数组,然后循环加载到 mongodb 集合中,一次一条记录. 当我 运行 在调试时,在 "var v = i;" 行设置断点,我可以查询 mongo 集合,并看到一个接一个填充的记录。

但是,一旦循环结束 - 所有记录的数据都消失了! 实际的记录仍然在那里,但它们都是空的。我刚刚在每条记录中看到的数据已经不在那些记录中了。

这可能是一些有线作用域问题,但是,作为新手,我不能说出那是什么。

这是我的代码:

exports.excelFileParser = function(fileName, tabName, metadataFields){
    var assert = require('assert');
    console.log(metadataFields);
    if(typeof require !== 'undefined') XLSX = require('xlsx');

    var mongodb = require('mongodb');
    var _ = require('underscore');

    var fs = require('fs');

    var Converter=require("csvtojson").core.Converter;

    var  distinctDataFields;

    var MongoClient = mongodb.MongoClient;

    var url = 'mongodb://localhost:27017/datamanager-03-test';

    var fileName = 'clean_file.csv';

    //fs.writeFileSync(fileName, newCsvLines);

    var csvFileName=fileName;
    var fileStream=fs.createReadStream(csvFileName);
//new converter instance
    var csvConverter=new Converter({constructResult:true});

    //end_parsed will be emitted once parsing finished
    csvConverter.on("end_parsed",function(jsonObj){
        //console.log(jsonObj); //here is your result json object
        makeRecords(jsonObj);

    });

    function makeRecords(result){
        console.log(result.length);

        MongoClient.connect(url, function (err, db) {
            if (err) {
                console.log('Unable to connect to the mongoDB server. Error:', err);
            } else {
                console.log('Connection established to', url);

                var collectionName = 'DC_Facilities';

                db.open(function(err, client){
                    client.createCollection(collectionName, function(err, col) {
                    });

                    var collection = db.collection(collectionName);

                    for(var i =0;i < result.length; i++){

                        var dataRecord = result[i];

                        collection.insert(dataRecord);

                        var v = i;
                    }
                    console.log("finished");
                    db.close();
                });
            }
        });
    }

    fileStream.pipe(csvConverter);
};

collection.insert 是一个异步函数,因此您在它们中的任何一个有机会完成之前调用 db.close()。您也不需要调用 createCollection,因为如果该集合尚不存在,将为您创建。

因此您的代码应该看起来像这样,以便在所有 insert 操作完成之前不会调用 db.close()

db.open(function(err, client){
    var collection = db.collection(collectionName);
    var inserted = 0;
    for(var i = 0; i < result.length; i++){
        var dataRecord = result[i];
        collection.insert(dataRecord, function(err) {
            if (++inserted == result.length) {
                console.log("finished");
                db.close();
            }
        });
    }
});