问题 如何在2个应用程序之间共享mongoose模型?


我有2个应用程序,每个应用程序在不同的文件夹中,他们需要共享相同的模型。

我想将app A中的models文件夹符号链接到app B中的models文件夹。

我遇到的问题是,一旦你在应用程序A中调用mongoose.model('Model',Schema),它们就会与该应用程序的mongoose / mongodb连接“绑定”。

有没有人有关于管理这个的最佳方法的任何提示?


1399
2017-09-28 00:34


起源

当你说“2个应用程序”时,你的意思是两个独立的节点实例,每个实例运行其中一个应用程序? - JohnnyHK
是的,完全独立的应用程序,但他们将共享相同的数据库,因此共享模型。 - evilcelery
然后你应该没有任何问题,因为每个应用程序将获得自己的一组模型。你看到了什么样的问题? - JohnnyHK
我不认为这也是一个问题,但如果我需要appB中appA的模型,查询永远不会运行。对一个简单的Model.find的回调永远不会被调用。有一个问题(现在找不到)我遇到了Aaron Heckman正在解释关于模型如何与特定连接有效联系的类似问题。 - evilcelery
这里肯定还有别的东西,因为我确定Aaron指的是那个叫 mongoose.model 这种模式的联系 例 到默认的mongoose连接。我在应用程序之间共享模型,但我没有遇到任何问题。 - JohnnyHK


答案:


你可以通过这样的方式分享你的mongoose实例

var mongoose = require('mongoose');
module.exports.mongoose = mongoose;

var user = require('./lib/user');

现在在“lib / user.js”里面

var mongoose = module.parent.mongoose;
var model = mongoose.model('User', new mongoose.Schema({ ... });
module.exports = model;

所以这样做可以在其他应用程序中使用“lib / user.js”


8
2017-10-11 19:17



这是一个很好的答案。一个小调整是lib / user.js文件需要使用module.parent.exports.mongoose引用mongoose。我通过执行显示父模块对象图的console.log(module.parent)来解决这个问题。 - Simon Curd


我共享Mongoose模型的方法是将mongoose对象作为参数传递给定义模式的共享模块并创建模型。所以带有共享模式/模型的文件如下所示:

module.exports = function(mongoose) {

    var packageSchema = new mongoose.Schema({
        title:          { type: String, required: true },
        description:    String
    });

    mongoose.model('Package', packageSchema, 'packages');
};

然后每个项目都要求他们这样:

var mongoose = require('mongoose');
var mongo_url = process.env.MONGO_CONNECTION;
mongoose.Promise = global.Promise;

mongoose.connect(mongo_url, connectOpts);
require('../../../shared/models/packages')(mongoose);

4
2017-11-01 12:29





我最终在这里做的是在app2中将app1导入为子模块(使用Git)。这样,模型可以正常导入,并与应用程序的默认值相关联 mongoose 连接。


2
2017-11-26 14:39



这听起来很有趣。你能说详细点吗? - Josh Elias
更多信息: git-scm.com/docs/git-submodule - chemitaxis
我期待做类似的事情。您是否仍然可以独立运行节点应用程序?我想在应用程序之间共享我的用户模型,但我还希望保留使用pm2单独运行每个应用程序的能力。 - Sam Munroe


./shared/models/user.js

./app1/app.js
var user = require('../shared/user.js');

./app2/app.js
var user = require('../shared/user.js');

我不明白你为什么不能从共享路径加载模型。


1
2017-09-28 01:19



这对我不起作用,对模型的调用很好,但我得到了空查询!子模块解决方案完美无缺! - Amr Ragaey


一种方法是将Schema抽象为纯JavaScript对象,然后导入该对象以用于在应用程序中构建模型。

例如,对于“产品”架构:

WWW / APP1 / ProductConfig.js

const ProductConfig = {
  name: String,
  cost: Number
}
module.exports = ProductConfig;

WWW / APP1 / ProductSchema.js

const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const ProductConfig = require('./ProductConfig');

const Product = new Schema(Product);

module.exports = mongoose.model('Product', Product);

WWW / APP2 / ProductSchema.js

const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const ProductConfig = require('../app1/ProductConfig');

const Product = new Schema(Product);

module.exports = mongoose.model('Product', Product);

0
2018-01-18 09:50





如果要在其他NPM软件包之间重用Mongoose软件包,最好的方法是在顶级应用程序中安装共享软件包,然后使用它来初始化其他NPM软件包。

你可以使用这个npm模块: https://www.npmjs.com/package/mongoose-global


-1
2017-08-07 08:47