個人的には、initメソッドを使用して個別の「共通」プロジェクトを作成し、すべてのモデルをmongodbに登録し、モデルへのアクセスが必要なアプリのapp.jsファイルでinitメソッドを呼び出します。
- 共有プロジェクトを作成する -標準のプロセスに従って、新しいノードプロジェクトを作成します。
-
package.json -共有プロジェクトで、
package.json
を設定します 次のエントリを含むファイル:"main": "index.js"
-
モデルを追加 -新しい
models
を作成します 共有プロジェクト内のフォルダー。すべてのマングーススキーマとプラグインが含まれます。 userSchemaファイルをmodelsフォルダーに追加し、user.js
という名前を付けます。 。var mongoose = require('mongoose'); var userSchema = new mongoose.Schema({ email: String }); module.exports = mongoose.model('User', userSchema);
-
index.js -次に、プロジェクトのルート
index.js
ファイルは、アプリで使用できる共有オブジェクトを作成し、モデルとinit
を公開します 方法。これをコーディングする方法はたくさんありますが、私が行っている方法は次のとおりです。function Common() { //empty array to hold mongoose Schemas this.models = {}; } Common.prototype.init = function(mongoose) { mongoose.connect('your mongodb connection string goes here'); require('./models/user'); //add more model references here //This is just to make referencing the models easier within your apps, so you don't have to use strings. The model name you use here must match the name you used in the schema file this.models = { user: mongoose.model('User') } } var common = new Common(); module.exports = common;
common
を参照する プロジェクト -共有プロジェクトを参照する場合は、package.json
に共有プロジェクトへの参照を追加します アプリ内でファイルを作成し、common
という名前を付けます 。個人的には、GitHubを使用してプロジェクトを保存し、リポジトリパスを参照しました。私のリポジトリはプライベートだったので、パスでキーを使用する必要がありました。これはGitHubサポートサイトで説明されています。-
アプリでモデルを初期化します -アプリの開始スクリプト(
app.js
であると想定します) この例の場合)common
への参照を追加します プロジェクトしてinit
を呼び出します mongodbサーバーに接続してモデルを登録する方法。//at the top, near your other module dependencies var mongoose = require('mongoose') , common = require('common'); common.init(mongoose);
-
アプリの任意の場所でモデルを使用する -マングースが接続プールを確立し、モデルが登録されたので、アプリ内の任意のクラスのモデルを使用できます。たとえば、
user
に関する情報を表示するページがあるとします。 あなたはこのようにそれを行うことができます(テストされていないコード、例のためにこれを書いただけです):var common = require('common'); app.get('/user-profile/:id', function(req, res) { common.models.user.findById(req.params.id, function(err, user) { if (err) console.log(err.message); //do something else to handle the error else res.render('user-profile', {model: {user: user}}); }); });
編集 申し訳ありませんが、あるスキーマを別のスキーマから継承している行が表示されませんでした。他の回答の1つが述べているように、マングースはすでにplugin
の概念を提供しています 。上記の例では、次のようにします。
共通モジュールの「/models/base-profile-plugin.js」
module.exports = exports = function baseProfilePlugin(schema, options){
//These paths will be added to any schema that uses this plugin
schema.add({
_user: {type: Schema.Types.ObjectId, ref: 'User', required: true},
name: {type: String, required: true},
bio: {type: String, required: true},
pictureLink: String
});
//you can also add static or instance methods or shared getter/setter handling logic here. See the plugin documentation on the mongoose website.
}
共通モジュールの「/models/entrepreneur.js
」var mongoose = require('mongoose')
, basePlugin = require('./base-profile-plugin.js');
var entrepreneurSchema = new mongoose.Schema({
mentors: {type: Schema.Types.ObjectId, ref: 'Mentor'}
});
entrepreneurSchema.plugin(basePlugin);
module.exports = mongoose.model('Entrepreneur', entrepreneurSchema);