首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >猫鼬模型测试需要模型

猫鼬模型测试需要模型
EN

Stack Overflow用户
提问于 2013-02-01 10:55:40
回答 5查看 6.3K关注 0票数 7

我在测试猫鼬模型时遇到了问题

我的结构就像

  • app
    • 模型
      • 地址
      • 用户
      • 组织

代码语言:javascript
复制
- test

模型用户和组织都需要知道模型地址。我的模型结构如下:

代码语言:javascript
复制
module.exports = function (mongoose, config) {

    var organizationSchema = new mongoose.Schema({

        name : {
            type : String
        },
        addresses : {
            type : [mongoose.model('Address')]
        }

    });

    var Organization = mongoose.model('Organization', organizationSchema);

    return Organization;
};

在我的正常应用程序中,我需要地址,然后才需要用户和组织,一切都很好。我现在为用户和组织编写了测试。为了注册地址模型,我称之为require('../models/Address.js'),如果我运行一个测试,这个功能可以正常工作。但是,如果我在一个批处理中运行所有测试,我会得到一个错误,因为我试图注册两次地址。

OverwriteModelError: Cannot overwrite Address model once compiled.

我该如何解决这个问题?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-02-01 11:15:58

问题是你不能设置两次猫鼬模型。解决问题的最简单方法是利用node.js require函数。

Node.js缓存对require的所有调用,以防止您的模型初始化两次。但你用函数包装你的模型。展开它们将解决您的问题:

代码语言:javascript
复制
var mongoose = require('mongoose');
var config = require('./config');

var organizationSchema = new mongoose.Schema({
    name : {
        type : String
    },
    addresses : {
        type : [mongoose.model('Address')]
    }
});

module.exports = mongoose.model('Organization', organizationSchema);

替代解决方案是确保每个模型只初始化一次。例如,可以在运行测试之前初始化所有模块:

代码语言:javascript
复制
Address = require('../models/Address.js');
User = require('../models/User.js');
Organization = require('../models/Organization.js');

// run your tests using Address, User and Organization

也可以将try catch语句添加到模型中以处理此特殊情况:

代码语言:javascript
复制
module.exports = function (mongoose, config) {

    var organizationSchema = new mongoose.Schema({

        name : {
            type : String
        },
        addresses : {
            type : [mongoose.model('Address')]
        }

    });

    try {
        mongoose.model('Organization', organizationSchema);
    } catch (error) {}

    return mongoose.model('Organization');
};

更新:在我们的项目中,/models/index.js文件来处理所有事情。首先,它调用mongoose.connect来建立连接。然后,它需要models目录中的每个模型并创建一个字典。因此,当我们需要某种模型(例如user)时,我们需要调用require('/models').user

票数 14
EN

Stack Overflow用户

发布于 2014-10-01 13:24:26

最佳解决办法(海事组织):

代码语言:javascript
复制
try {
  mongoose.model('config')
} catch (_) {
  mongoose.model('config', schema)
}
票数 3
EN

Stack Overflow用户

发布于 2013-06-12 02:13:20

这个问题已经有了答案,但是对于一个独特的方法来完成这个签出models。此示例项目使用一个register_models.js,它包含文件名数组中的所有模型。它的工作真的很好,你结束了你所有的模型,几乎所有你需要的地方。请记住,node.js的缓存将在项目运行时缓存对象。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14644742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档