Javascript 为什么这个简单的Mongoose.js程序在执行';嵌套';拯救

Javascript 为什么这个简单的Mongoose.js程序在执行';嵌套';拯救,javascript,mongodb,node.js,mongoose,Javascript,Mongodb,Node.js,Mongoose,[编辑]:我用一个非常具体的可重复的例子更新了前面的问题。 这是我的全部计划 我分别使用集合A和B创建两个模式ASchema和BSchema,创建两个对象A和B,并尝试按顺序保存它们-即,首先A然后B mongoose = require('mongoose'), Schema = mongoose.Schema; mongoose.connect('mongodb://localhost/test'); ASchema = new Schema({ text: String

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

这是我的全部计划

我分别使用集合
A
B
创建两个模式
ASchema
BSchema
,创建两个对象
A
B
,并尝试按顺序保存它们-即,首先
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();
我预期会发生什么:
它应该打印
保存的a:
,然后是文档a,然后是
保存的b:
,然后是文档b。

实际发生的情况:
它打印
保存的一个:{text:'this is a',_id:4ee4cab00d2c35fc04000001}
等等。程序也没有停止;它保持“卡住”状态。
查看mongo shell,我发现已经创建了一个集合
as
a
,由mongoose进行复数,这没问题),并且我可以看到其中保存的文档带有
db.as.find()
。但是,我找不到一个集合
bs


调整:
在保存代码中,交换
a
b
(保存顺序)的位置会导致
b
保存,而
a
不保存。因此,问题并不特别在于
a
b



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

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

mongoose.disconnect();
您不应该这样做,因为仍然存在需要处理的查询,并且您不知道何时处理(在本例中,这是第二个查询)。因此,第一个查询被执行,Mongoose断开连接并挂起第二个查询

解决方案

删除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 ");
  }); 
有关最佳实践,请参见链接


错误似乎不是来自此代码,它看起来完全正常。我想可能是代理出错了或者类似的问题。你能用console.log吗?这不是个人/代理的问题,因为在代码中交换他们的位置会产生相同的效果-保存“内部”内容时它总是挂起。用更一般的内容编辑示例,任何人都可以测试。谢谢!我完全忘了那条线没问题,很高兴我能帮上忙!