为什么这个简单的Mongoose.js程序在执行'嵌套'保存
Why does this simple Mongoose.js program freeze while doing a 'nested' save?
[edit]:我用一个非常具体的可重复的例子更新了前面的问题。
这是我的整个程序。
我分别用集合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();
我期望应该发生的事情:
它应该打印saved a :
,然后是文档a,然后是saved b :
,然后是文档b。
实际情况:
打印saved a : { text: 'this is a', _id: 4ee4cab00d2c35fc04000001 }
,仅此而已。程序也不会停止;它会"卡住"。
通过mongo shell,我发现已经创建了一个集合as
(a
由mongoose复数化,这是可以的),并且我可以看到db.as.find()
在其中保存的文档。然而,我找不到一个集合bs
。
Tweak:
在保存代码中,交换a
和b
的位置(保存顺序)会导致b
被保存,a
不被保存。所以问题不在于a
或b
。
问题:为什么不保存下一个文档?
答案很简单,看看你的最后一行:
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
相关文章:
- 无法在通过jQuery的ajax加载的页面中执行javascript
- JavaScript执行暂时挂起页面
- 如何在ReactJS JSX中执行嵌套的if-else语句
- 如何停止javascript的执行并允许用户保存表单
- 如何确保在 Mocha 中的 done() 之前执行对数据库的循环保存
- 在nodejs中执行procces数组时保存数据
- 防止对模式保存执行双重操作
- jqTree 在 IE11 中不执行保存状态工作正常 FF12.
- 如何防止代码在 JQuery 插件完成保存 cookie 之前执行
- 阻止ddl在执行OnSelectedIndexChanged事件时触发未保存的更改警告
- 为什么这个简单的Mongoose.js程序在执行'嵌套'保存
- 在执行页面's javascript后保存页面的HTML输出
- Map函数保存后不执行
- 需要更改代码以定期执行(自动保存)
- 使用Mongoose保存多个文档,并在保存最后一个文档时执行操作
- Redux重载:我应该在哪里执行多个文件的下载并保存到FS
- 当html页面发生更改时,变量处于点击/保存状态时,会执行许多操作
- 如何显示“;已保存"执行Redirect()后的消息.
- 将键关闭保存在数组中并执行
- 当通过JSON.stringify保存数据时无法执行json_decode