当前位置:  开发笔记 > 编程语言 > 正文

为什么这个简单的Mongoose.js程序会在执行'嵌套'保存时冻结?

如何解决《为什么这个简单的Mongoose.js程序会在执行'嵌套'保存时冻结?》经验,为你挑选了1个好方法。

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

这是我的整个计划.

我创建了两个架构ASchemaBSchema与收藏A,并B分别使两个物体ab,并尝试按顺序将它们保存-也就是说,第一ab.

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.

调整:
在保存代码中,交换ab(保存顺序)的位置导致b保存,并且a不保存.所以这个问题并不是专门用于ab.

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



1> alessioalex..:

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

mongoose.disconnect();

你不应该这样做,因为仍然有需要处理的查询,你不知道什么时候(在我们的例子中它是第二个查询).所以会发生第一个查询被执行,Mongoose断开连接并挂起第二个查询.

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

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有