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

Why does this simple Mongoose.js program freeze while doing a 'nested' save?

本文关键字:执行 保存 嵌套 程序 简单 js Mongoose 为什么      更新时间:2023-09-26

[edit]:我用一个非常具体的可重复的例子更新了前面的问题。

这是我的整个程序。

我分别用集合AB创建了两个模式ASchemaBSchema,创建了两个对象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,我发现已经创建了一个集合as (a由mongoose复数化,这是可以的),并且我可以看到db.as.find()在其中保存的文档。然而,我找不到一个集合bs

Tweak:
在保存代码中,交换ab的位置(保存顺序)会导致b被保存,a不被保存。所以问题不在于ab

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

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

mongoose.disconnect();

你不应该这样做,因为仍然有查询需要处理,你不知道什么时候(在我们的情况下,这是第二个查询)。因此,第一个查询被执行,Mongoose断开连接并挂起第二个查询。

<<p> 解决方案/strong>

在最后一个查询执行后删除put mongoose.disconnect();的最后一行

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/!主题/node-mongodb-native/5 cpt84tusvg