javascript - 为什么这个简单的 Mongoose.js 程序在执行 'nested' 保存时会卡住?

标签 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查看,我发现有一个集合as ( a 由 mongoose 复数,没关系)已创建,我可以使用 db.as.find() 看到其中保存的文档。但是,我找不到集合bs .

调整:
在保存代码中,交换a的位置和b (保存顺序)原因b被保存,并且a以免被拯救。所以问题不在于 ab .

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

最佳答案

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

mongoose.disconnect();

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

解决方案

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

关于javascript - 为什么这个简单的 Mongoose.js 程序在执行 'nested' 保存时会卡住?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8464128/

相关文章:

javascript - 如何获取包含不重复项的单个数组及其值的总和。有序描述

javascript - 用于多显示器和全屏的 Firefox Web 扩展 APIS

mongodb - Mongo 的 convertToCapped 是否每次运行都分配更多空间?

node.js - 在 Nodejs fork 进程之间共享数千个开放的 WebSocket

node.js - 在 Node.js 中解析数据

node.js - 如何获得另一个依赖项的依赖项?

javascript - Ajax 数据库插入不起作用

javascript - 如何更新此数据而不重新绘制已有的数据点?

Java MongoDB聚合-多个字段的求和

facebook - 如何为应用程序设计用户帐户和用户的社交帐户数据库