【问题标题】:How can I share mongoose models between 2 apps?如何在 2 个应用程序之间共享猫鼬模型?
【发布时间】:2012-09-19 20:49:11
【问题描述】:

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

我想将应用 A 中的模型文件夹符号链接到应用 B 中的模型文件夹。

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

有人对管理此问题的最佳方法有任何建议吗?

【问题讨论】:

  • 当您说“2 个应用程序”时,您是指两个独立的节点实例,每个实例都运行其中一个应用程序吗?
  • 是的,完全独立的应用程序,但它们将共享相同的数据库和模型。
  • 那么您应该没有任何问题,因为每个应用程序都会获得自己的模型集。您遇到过什么样的问题?
  • 我也不认为这会是一个问题,但是如果我需要 appB 中的 appA 的模型,查询永远不会运行。对简单 Model.find 的回调永远不会被调用。有一个 SO 问题(现在找不到)我遇到了 Aaron Heckman 正在解释一个类似的问题,即模型如何有效地与特定连接相关联。
  • 这里肯定有其他事情发生,因为我确定 Aaron 指的是调用 mongoose.model 将模型 instance 与默认的猫鼬连接联系起来。我已经在应用程序之间共享模型,但没有遇到任何问题。

标签: node.js mongodb express mongoose


【解决方案1】:
./shared/models/user.js

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

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

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

【讨论】:

  • 这对我不起作用,对模型的调用很好,但我得到了空查询!子模块解决方案完美运行!
  • 你是如何在服务器上部署这个项目的?因为您的共享文件夹可能不在根目录下?
【解决方案2】:

您已经通过使用类似的方式分享了您的猫鼬实例

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”

【讨论】:

  • 这是一个很好的答案。一个小的调整是 lib/user.js 文件需要使用 module.parent.exports.mongoose 来引用 mongoose。我通过执行显示父模块对象图的 console.log(module.parent) 来解决这个问题。
  • 或者更确切地说只导出孩子的猫鼬实例......如果你正在导入一个东西......导入其他的不会出错? IDK虽然哪种方法会更好......
【解决方案3】:

我在这里最终做的是在 app2 中将 app1 作为子模块(使用 Git)导入。这样,模型可以正常导入并绑定到应用的默认mongoose 连接。

【讨论】:

  • 这听起来很有趣。你能详细说明一下吗?
  • 我想做类似的事情。您仍然能够独立运行节点应用程序吗?我想在应用之间共享我的用户模型,但我也想保留使用 pm2 单独运行每个应用的能力。
  • 你可以将它创建为一个 npm 包,如 @app-name/schemas
  • 能否请您发送您的目录结构以获得更清晰的信息?我遇到了类似的问题,事实上我也尝试过 syslink 到模型,但效果很好。
【解决方案4】:

我共享 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);

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      一种方法是将 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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-12
        • 2011-05-07
        • 2013-10-31
        • 1970-01-01
        • 1970-01-01
        • 2012-06-02
        • 1970-01-01
        • 2022-01-19
        相关资源
        最近更新 更多