【问题标题】:Callback function running unexpectedly回调函数意外运行
【发布时间】:2014-06-20 07:06:44
【问题描述】:

我在下面编写了一个小代码,问题在 cmets 中进行了解释。问题在于创建集合时的粗体回调函数。创建集合时出错,当创建集合的主要功能结束时应立即显示消息,但消息随机出现,如下面的输出所示:

在标有问号的行中称为意外。我在 node.js 和 mongoDB 环境中运行这个 js 文件。

谢谢。

   var mongo = require("mongodb");
    var Db = mongo.Db;
    var mongoC = mongo.MongoClient;
    var assert = require('assert');

    mongoC.connect("mongodb://localhost:27017/social", {
        native_parser: true
    }, function (err, db) {
        if (!err) {
            console.log("We are Connected!\n");

            //creating the Collection
            db.createCollection("node", {
                strict: true
            }, function (err, coll) {
                if (!err) {
                    console.log("*********Collection Created Succesfully*********");
                    console.log("Collection created Successfully\n" + JSON.stringify(coll) + "\n-------------------\n");
                }
    else{
    console.log("Cannot create Collection because " + err);
    }
    });
    //Collection created now


    console.log("*********************************inserting documents in the selected collection***********************");


    var coll = db.collection('node');
    var doc1 = {"name":"doc1","age":26};
    var manydocs = [{"name":"doc2","age":45},{"name":"doc3","age":19}];

    //coll.insert(doc1,{w:1},function(err,result){if(err){console.log("Error while inserting doc1 " + err);}else{console.log(result);}});
    //coll.insert(manydocs,{w:1},function(err,result){if(err){console.log("Error while inserting manydocs " + err);}});
    console.log("***************************documents are now updated successfully***********************************");


    console.log("*******************Now let us update the documents*******************");
    var query = {"name": "doc1"};
    var update= {$set : {"age":86}};
    //coll.update(query,update,function(err,result){if(!err){console.log(result + "'s age has been successfully update to " + result);}});
    console.log("***************Docments updated");


    console.log("*******************Querying the items**************************");

    coll.find().each(function(err,myDoc){console.dir(myDoc);console.dir("hey");});
    //coll.findOne(query,function(err,result){});

    var stream = coll.find(query).stream();
    stream.on("data",function(item){console.log(item._id);});
    stream.on("end",function(){});



    }
    else {
    console.log("Cannot connect because : " + err);
    }
    });

下面是输出。 我们已连接!

*********************************inserting documents in the selected collection***********************
***************************documents are now updated successfully***********************************
*******************Now let us update the documents*******************
***************Docments updated
*******************Querying the items**************************
Cannot create Collection because Error: Collection node already exists. Currently in strict mode.

【问题讨论】:

    标签: node.js callback asynccallback


    【解决方案1】:

    您应该在db.createCollection 的回调中处理node 集合:

    更新:运行此代码:

    var mongo = require("mongodb");
    var Db = mongo.Db;
    var mongoC = mongo.MongoClient;
    var assert = require('assert');
    
    mongoC.connect("mongodb://localhost:27017/social", {
      native_parser: true
    }, function (err, db) {
      if (!err) {
        console.log("We are Connected!\n");
    
        //creating the Collection
        db.createCollection("node", {
          strict: true
        }, function (err, coll) {
          if (!err) {
            console.log("*********Collection Created Succesfully*********");
            console.log("Collection created Successfully\n" + JSON.stringify(coll) + "\n-------------------\n");
    
            //Collection created now
    
    
            console.log("*********************************inserting documents in the selected collection***********************");
    
            var doc1 = {
              "name": "doc1",
              "age": 26
            };
            var manydocs = [{
              "name": "doc2",
              "age": 45
            }, {
              "name": "doc3",
              "age": 19
            }];
    
            //coll.insert(doc1,{w:1},function(err,result){if(err){console.log("Error while inserting doc1 " + err);}else{console.log(result);}});
            //coll.insert(manydocs,{w:1},function(err,result){if(err){console.log("Error while inserting manydocs " + err);}});
            console.log("***************************documents are now updated successfully***********************************");
    
    
            console.log("*******************Now let us update the documents*******************");
            var query = {
              "name": "doc1"
            };
            var update = {
              $set: {
                "age": 86
              }
            };
            //coll.update(query,update,function(err,result){if(!err){console.log(result + "'s age has been successfully update to " + result);}});
            console.log("***************Docments updated");
    
    
            console.log("*******************Querying the items**************************");
    
            coll.find().each(function (err, myDoc) {
              console.dir(myDoc);
              console.dir("hey");
            });
            //coll.findOne(query,function(err,result){});
    
            var stream = coll.find(query).stream();
            stream.on("data", function (item) {
              console.log(item._id);
            });
            stream.on("end", function () {});
    
          } else {
            console.log("Cannot create Collection because " + err);
          }
        });
      } else {
        console.log("Cannot connect because : " + err);
      }
    });
    

    【讨论】:

    • 如果我在这种情况下得到相同的输出,那就太好了,但我现在得到的是非常出乎意料的。这是否意味着它在错误IO中花费时间并且同时节点执行其他代码。
    • 请运行上面的代码并告诉我输出是什么。此代码是异步的,因此您无法预测被调用的操作顺序
    猜你喜欢
    • 1970-01-01
    • 2016-03-05
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多