Nodejs模块导出

时间:2014-10-20 20:05:30

标签: node.js

在我的节点应用程序中,我在两个不同的文件中定义模型(使用Sequelize ORM):models / app-acl.js和models / app-models.js;

然后我将它们导入第三个文件(models.js),我在其中定义模型之间的关系:

//file models.js
var aclModel = require('./app-acl.js');
var appModel = require('./app-models.js');

//defining relationships...
aclModel.Group.hasMany(aclModel.User, {onDelete: 'CASCADE'});
...


//exporting models:
module.exports = {
    aclModel: aclModel,
    appModel: appModel
}

这样做,在我可以做的应用程序的其他部分

var models = require('models/models.js') 

并通过models.aclModel ...和models.appModel

访问所有模型

事情是,有时我需要对任意模型进行操作,例如" find"不知道它是aclModel还是appModel;所以我想以相同的名义出口两个;类似的东西:

module.exports = {
    models: aclModel + appModel //merged together
}

由此我可以做到

models[name].find.....

正在"名称"来自aclModel或来自appModel的模型,它将在两种情况下都有效;

我想在导出之前将model.js中的aclModel和appModel合并在一起,如下所示:

function merge (destination, source) {
    for (var property in source)
        destination[property] = source[property];
    return destination;
}

module.exports = {
    models: merge(aclModel, appModel)
}

但这不起作用;有没有人有这样做的解决方案?

2 个答案:

答案 0 :(得分:1)

好的,在评论中澄清你的问题后(​​下次通过包含一个表达你的问题的真实程序而不仅仅是片段和省略号来节省每个人的时间),我首先想到的是你的设计可能最终被误导但是仍然是可以实现和直截了当的在javascript。

将您的文件放在以下结构中:

models/index.js
models/acl-model.js
models/app-model.js

models/index.js执行此操作:

var _ = require('lodash'); _.extend(module.exports, require('./acl-model'), require('./app-model'));

这会将两个模型模块的所有属性组合到索引模块中。如果名称重复冲突,最后一个将赢。

然后,您可以使用require('models');或具有require('models/acl-model');的特定参考来获取对索引的引用。 index.js将支持models[name]动态属性查找访问。因此你可以这样做:

var models = require('models'); var name = "Group"; models[name].find();

只要您的某个模型模块中有一个名为“Group”的模型,就可以使用。

答案 1 :(得分:0)

也许您可以使用:

{{1}}

这是一种示例方法