[编辑]:我用一个非常具体的可重现示例更新了上一个问题。
这是我的整个程序。
我创建两个模式 ASchema
和BSchema
有收藏A
和B
分别制作两个对象 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();
我期望会发生什么:
它应该打印 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
以免被拯救。所以问题不在于 a
或b
.
问题:为什么不保存下一个文档?
最佳答案
答案很简单,看看你的最后一行:
mongoose.disconnect();
您不应该这样做,因为仍然有查询需要处理,并且您不知道何时处理(在我们的例子中是第二个查询)。所以发生的情况是第一个查询被执行,Mongoose 断开连接并挂起第二个查询。
解决方案
执行最后一个查询后,删除 put mongoose.disconnect();
上的最后一行。
关于javascript - 为什么这个简单的 Mongoose.js 程序在执行 'nested' 保存时会卡住?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8464128/