为什么这个简单的Mongoose.js程序会在执行'嵌套'保存时冻结?

时间:2011-12-11 12:56:53

标签: javascript mongodb node.js mongoose

[编辑]:我使用一个非常具体的可重复示例更新了上一个问题。

这是我的整个计划。

我分别创建了两个带有集合ASchemaBSchema的模式AB,创建了两个对象ab,并尝试保存它们顺序 - 也就是说,先是a然后是b

mongoose = require('mongoose'),
    Schema = mongoose.Schema;

mongoose.connect('mongodb://localhost/test');

ASchema = new Schema({
    text: String
});

BSchema = new Schema({
    val: Number
});

A = mongoose.model('A', ASchema);
B = mongoose.model('B', BSchema);

a = new A({text: 'this is a'});
b = new B({val: 5});

a.save(function(err) {
    if(err) console.log(err.message);
    else {
        console.log('saved a : ', a);
        b.save(function(err) {
            if(err) console.log(err.message);
            else {
                console.log('saved b : ', b);
            }
        });
    }
});

mongoose.disconnect();

我期望会发生什么:
它应该打印saved a :,然后打印文档a,然后打印saved b :,然后打印文档b。

实际发生的事情:
它打印saved a : { text: 'this is a', _id: 4ee4cab00d2c35fc04000001 },仅此而已。该计划也不会停止;它会“卡住”。
通过浏览mongo shell,我发现已创建了一个集合asa由mongoose复数,即可),我可以使用db.as.find()查看其中保存的文档。但是,我找不到集合bs

调整:在保存代码中,交换ab(保存顺序)的地点会导致b被保存,{ {1}}不能保存。所以问题不在于aa

问题:为什么不保存下一个文档?

2 个答案:

答案 0 :(得分:5)

答案很简单,看看你的最后一行:

mongoose.disconnect();

你不应该这样做,因为仍然有需要处理的查询而你不知道何时(在我们的例子中它是第二个查询)。所以会发生第一个查询被执行,Mongoose断开连接并挂起第二个查询。

<强>解决方案

在执行完最后一个查询后删除放置mongoose.disconnect();的最后一行。

答案 1 :(得分:0)

mongoose.disconnect();  //Do not do this as async methods keep running in background.

不要为每个查询打开+关闭连接。

打开连接一次,然后重复使用。

我更喜欢以下方式:

MongoDBconObj.open(function(err, db) {
    //re-use db 
    // All your application codes goes here...
    //..
    http.createServer(onRequest).listen(8080);
    console.log("HTTP is listening on 127.0.0.1:8080 ");
  }); 

请参阅最佳做法链接

https://groups.google.com/forum/#!topic/node-mongodb-native/5cPt84TUsVg