Node.js nodejs中循环的mongodb内部回调

Node.js nodejs中循环的mongodb内部回调,node.js,mongodb,callback,Node.js,Mongodb,Callback,我试图用Excel中的数据填充mongoDB集合。我认为我理解回调的异步性质,因此在数据库回调之前使用另一个函数对作用域进行了本地化。然而,我无法克服我的错误 这是代码 var http = require('http'); var parseXlsx = require('excel'); var mongo = require('mongoskin'); var faker = require('faker'); var moment = require('moment'); var Obj

我试图用Excel中的数据填充mongoDB集合。我认为我理解回调的异步性质,因此在数据库回调之前使用另一个函数对作用域进行了本地化。然而,我无法克服我的错误

这是代码

var http = require('http');
var parseXlsx = require('excel');
var mongo = require('mongoskin');
var faker = require('faker');
var moment = require('moment');
var ObjectID = require('mongodb').ObjectID;

var uristring =
    process.env.MONGOLAB_URI ||
    process.env.MONGOHQ_URL ||
    'mongodb://localhost:27017/loadmongo/data';


var db = mongo.db(uristring, {native_parser:true});

db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function callback () {
  console.log('connected');


});

http.createServer(function handler(req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

parseXlsx('userRegistration.xlsx', function(err, data) {
    if(err) throw err;


    console.log(data.length);
    console.log(data[0][0]);    

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

        //(function(i){
        console.log('inside for loop');
        var t = Math.floor(Math.random()*10);
        var aCD = moment().subtract('days', t).format('MM DD YYYY');
        var tmpID = new ObjectID();
        console.log(data[i][0]);
        var tmp = {
                '_id': tmpID,
                'firstName': data[i][0],
                'lastName': data[i][1],
                'email1': data[i][2],
                'email2': data[i][3],
                'accountCreationDate': aCD,
                'location': {
                    'country' : data[i][9],
                    'city' : data[i][6],
                    'state' : data[i][7],
                    'stateCode' : data[i][7],
                    'zipcode' : data[i][10],
                    'streetName' : data[i][5],
                    'streetNumber' : data[i][4],
                    'countryCode' : data[i][8],
                    'longlat': {
                        'type' : "Point",
                        'coordinates': [data[i][12], data[i][11]]
                    }

                },
                'serviceNeededCurrent': {

                },
                'serviceOfferedCurrent': {

                },
                'serviceCompleted': {

                },
                'reviewsGiven': {

                },
                'reviewesRecieved': {

                },
                'financialRecords': {

                }
        };

        (function(tmp){
        db.collection('userRegistration').insert(tmp, function(err, result){
            if (err) {
                console.log(err);
                console.log('some error')

            }

            if (result)
                console.log('userRegistration Collection.. Done');


        }); 

        }(tmp));
    } //end of for loop


    }); // End of parsexlsx

哦,很抱歉,我没有意识到这些是您的2
控制台的输出。log
!好的,您只需在
data.length
之前停止循环即可

for (var i = 0; i < data.length; i++) {
for(变量i=0;i

数组索引范围从
0
-1
;)

这似乎只是parseXlsx方法的一个问题,不是吗?我想与Mongo无关……您的第43行是
console.log(数据[0][0]);
,不是吗?您确定您的文件路径吗?您认为呢?但是,看看输出675是console.log的输出(data.length);而Ernesto是console.log的输出(数据[0][0]);另外,当我删除整个for循环和数据库调用时,我没有看到错误。我还注意到,尽管看到了错误,数据库还是被正确填充。仍然无法找出错误的原因。谢谢,它起了作用。但是,我试着想,为什么我的代码在出现错误之前没有打印for循环的内容?
for (var i = 0; i < data.length; i++) {