【问题标题】:Why does this simple Mongoose.js program freeze while doing a 'nested' save?为什么这个简单的 Mongoose.js 程序在进行“嵌套”保存时会冻结?
【发布时间】:2012-01-17 20:17:41
【问题描述】:

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

这是我的整个程序。

我分别用集合AB 创建了两个架构ASchemaBSchema,创建了两个对象ab,并尝试按顺序保存它们——也就是说,首先是a,然后是@987654328 @。

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 被保存,a 不被保存。所以问题不在于ab

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

【问题讨论】:

  • 错误似乎不是来自这段代码,看起来完全没问题。我认为代理或类似的东西可能有错误。你能console.log吗?
  • 人员/代理没有问题,因为在代码中交换他们的位置会产生相同的效果 - 保存“内部”事物时它总是挂起。
  • 用更通用的东西编辑了这个例子,任何人都可以测试。

标签: javascript mongodb node.js mongoose


【解决方案1】:
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

【讨论】:

    【解决方案2】:

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

    mongoose.disconnect();
    

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

    解决方案

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

    【讨论】:

    • 谢谢!我完全忘了那条线在那里
    • 没问题,很高兴能帮上忙!
    猜你喜欢
    • 2012-07-13
    • 2011-11-13
    • 2022-01-23
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 2020-02-23
    • 2018-04-09
    • 1970-01-01
    相关资源
    最近更新 更多