2012-09-28 24 views
10

私は2つのアプリを持っていて、それぞれ異なるフォルダにあり、同じモデルを共有する必要があります。2つのアプリの間でmongooseモデルを共有するにはどうすればいいですか?

私は一度あなたがmongoose.model(「モデル」、スキーマ)を呼び出しているという事実の問題に実行しているアプリのB.

でモデルフォルダにアプリAからモデルフォルダをシンボリックリンクしたい

でアプリAは、そのアプリのmongoose/mongodb接続に「結びついています」。

これを管理する最善の方法はありますか?

+0

「2アプリ」と言うと、2つの別々のノードインスタンスがそれぞれ1つのアプリを実行していますか? – JohnnyHK

+0

もちろん、アプリを完全に分離していますが、同じデータベースとモデルを共有することになります。 – evilcelery

+0

次に、各アプリが独自のモデルセットを取得するため、問題はありません。あなたはどんな種類の問題を見ましたか? – JohnnyHK

答えて

2

私がここでやったのは、app1をapp2のサブモジュール(Git付き)としてインポートすることでした。このようにして、モデルは通常どおりにインポートされ、アプリケーションのデフォルトのmongoose接続に関連付けられます。

+3

これは非常に興味深いですね。あなたはおそらく詳しく説明できますか? –

+0

詳細はこちら:https://git-scm.com/docs/git-submodule – chemitaxis

1
./shared/models/user.js 

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

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

私はなぜ共有パスからモデルをロードできないのか分かりません。

+1

これは私のためには機能しません、モデルへの呼び出しは上手ですが、私は空のクエリを得ました!サブモジュールのソリューションは完璧に動作します! –

8

あなたがそう「あなたが必要とすることができるというようにそれをやって、「LIB/user.jsの」内部今、この

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

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

のような何かをして使用することによって周りの

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

をごマングースのインスタンスを共有していますlib/user.js "

+0

これは良い答えです。 1つの小さな微妙な調整は、lib/user.jsファイルがmodule.parent.exports.mongooseを使ってmongooseを参照する必要があることです。私は親モジュールオブジェクトグラフを表示するconsole.log(module.parent)を実行することでこれを理解しました。 –

3

私はMongooseモデルを共有する方法として、mongooseオブジェクトをスキーマを定義する共有モジュールの引数として渡してモデルを作成する方法があります。だから、共有スキーマ/モデルを持つファイルは、次のようになります

module.exports = function(mongoose) { 

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

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

し、各プロジェクトは、このようにそれらを必要とする:あなたは、他のNPMパッケージの間、あなたのマングースのパッケージを再利用する場合は、

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); 
0

それを行う最善の方法は、最上位のアプリケーションに共有パッケージをインストールし、それを使って他のNPMパッケージを初期化することです。

あなたはこのNPMモジュールを使用することができます。https://www.npmjs.com/package/mongoose-global

0

一つのアプローチを抽象化するための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); 
関連する問題