2017-12-01 12 views
2

Mongooseを使用してNodejsコードのファイル構造を改善しようとしています。Mongooseの異なるファイルでスキーマ、メソッド、静的を分離する方法

私は既に異なるスキーマを別々のファイルに分けていますが、いくつかのスキーマではメソッドと統計の数がかなり多く、大きすぎるスキンファイル(> 1500行)で終わります。

私は別のファイル内のメソッドとスキーマを分離するために望んでいたし、それらを「必要」スキーマ

var mongoose = require("mongoose"); 
var Schema = mongoose.Schema; 
var UserSchema = new Schema({ 
    email: String, 
    pwdhash: String, 
}); 

UserSchema.methods.someMethod1 = function() { 
    // Do something 1 
}; 

UserSchema.methods.someMethod2 = function() { 
    // Do something 2 
}; 

var User = mongoose.model("User", UserSchema); 

に私はそれが次のようになりたいと思った:上の、しかし

var mongoose = require("mongoose"); 
var Schema = mongoose.Schema; 
var UserSchema = new Schema({ 
    email: String, 
    pwdhash: String, 
}); 

// Requiring methods 
require("./methods/user.js"); 

var User = mongoose.model("User", UserSchema); 

/methods/user.jsファイルmongooseインスタンスからスキーマ(モデルのみ)を取得してメソッドを割り当てる方法を見つけることができません。

何か不足していますか?メソッドと静的メソッドを分離するためのいくつかのより良い選択肢はありますか?

答えて

1

あなたはこのような何か行うことができます。methods.jsファイルを作る

を、メソッドでこのコードを追加ファイル:あなたのメインのファイルでそれ以降

module.exports = function(UserSchema) { 
    UserSchema.methods.someMethod1 = function() { 
    // Do something 1 
    }; 

    UserSchema.methods.someMethod2 = function() { 
    // Do something 2 
    }; 
} 

を、あなたがこれをしなければなりません。

var mongoose = require("mongoose"); 
var Schema = mongoose.Schema; 
var UserSchema = new Schema({ 
    email: String, 
    pwdhash: String, 
}); 

// Requiring methods 
require("./methods.js")(UserSchema); 

var User = mongoose.model("User", UserSchema); 

私は、これは動作しますかなり確信している:)

+0

優秀!それは私が探していたものです! –

+0

ありがとう!私はそれがあなたのためにうまくいけばいいと思う:D –

0

これはそれを行うための一つの方法です。

UserMethods.js

module.exports = { 
someMethod1: function() {...}; 
someMethod2: function() {...}; 
} 

user.jsの

var mongoose = require("mongoose"); 
var Schema = mongoose.Schema; 
var UserSchema = new Schema({ 
    email: String, 
    pwdhash: String, 
}); 

Object.assign(UserSchema.methods, require("./UserMethods.js")); 

var User = mongoose.model("User", UserSchema); 
module.exports = User; 
0

だから、私は言うよ最初の事はあなたがスキーマファイルで1500+のラインを持っている場合は、良いチャンスがあるということですモデル内で結びつけることができる機能を持つモジュールを使用するのではなく、モデルロジックに多すぎるものを置いているということです。

これは、実際にはプラグインアーキテクチャを利用することだと言えます。これは、再利用と分離を行う素晴らしい方法です。

findByNameメソッドを静的にすべてのスキーマに追加する場合は、多くのスキーマに 'name'属性がある可能性があるためです。これを定義することができます:

// ./plugins/find-by-name.js 
function findByName(name, callback) { 
    this.find({ name: new RegExp(name, 'i') }, callback); 
} 

function findByNamePlugin(schema, options) { 
    schema.statics.findByName = findByname; 
} 

module.exports = findByNamePlugin; 

次に、あなたのUserSchemaファイルでは、それらを要求して追加することができます。

var mongoose = require("mongoose"); 
var findByNamePlugin = require('./plugins/findByName'); 
var Schema = mongoose.Schema; 
var UserSchema = new Schema({ 
    email: String, 
    pwdhash: String, 
}); 
UserSchema.plugin(findByNamePlugin); 
// add others. 
関連する問題