2012-03-31 13 views
49

マングースモデルを別のファイルに分けたいと思います。私はこのような、そうしようと試みてきた。そして、別のモジュールでのマングースモデルの定義

var mongoose = require("mongoose"); 
var Schema = mongoose.Schema; 
var ObjectId = Schema.ObjectId; 

var Material = new Schema({ 
    name    : {type: String, index: true}, 
    id     : ObjectId, 
    materialId   : String, 
    surcharge   : String, 
    colors    : { 
     colorName  : String, 
     colorId   : String, 
     surcharge  : Number 
    } 
}); 

var SeatCover = new Schema({ 
    ItemName   : {type: String, index: true}, 
    ItemId    : ObjectId, 
    Pattern    : String, 
    Categories   : { 
     year   : {type: Number, index: true}, 
     make   : {type: String, index: true}, 
     model   : {type: String, index: true}, 
     body   : {type: String, index: true} 
    }, 
    Description   : String, 
    Specifications  : String, 
    Price    : String, 
    Cost    : String, 
    Pattern    : String, 
    ImageUrl   : String, 
    Materials   : [Materials] 
}); 

mongoose.connect('mongodb://127.0.0.1:27017/sc'); 

var Materials = mongoose.model('Materials', Material); 
var SeatCovers = mongoose.model('SeatCover', SeatCover); 

exports.Materials = Materials; 
exports.SeatCovers = SeatCovers; 

、私はこのようなモデルを使用しようとしました:

var models = require('./models'); 

exports.populateMaterials = function(req, res){ 
    console.log("populateMaterials"); 
    for (var i = 0; i < materials.length; i++){ 
     var mat = new models.Materials(); 
     console.log(mat); 
     mat.name = materials[i].variantName; 
     mat.materialId = materials[i].itemNumberExtension; 
     mat.surcharge = materials[i].priceOffset; 
     for (var j = 0; j < materials[i].colors.length; j++){ 
      mat.colors.colorName = materials[i].colors[j].name; 
      mat.colors.colorId = materials[i].colors[j].itemNumberExtension; 
      mat.colors.surcharge = materials[i].colors[j].priceOffset; 
     } 
     mat.save(function(err){ 
      if(err){ 
       console.log(err); 
      } else { 
       console.log('success'); 
      } 
     }); 
    } 
    res.render('index', { title: 'Express' }); 
}; 

が、これは別のモジュールでモデルを参照する合理的なアプローチですか?

+1

はありません、代わりに '[材料]'の '[材質]'べきか? – Tinou

+0

いいえ、MaterialsはModelの名前です。これはSchemaの参照です。マテリアルは単なるローカル変数の名前です。 –

答えて

8

基本的なアプローチは妥当と思われます。

オプションとして、モデルとコントローラの機能を統合した「プロバイダ」モジュールが考えられます。そうすれば、app.jsでプロバイダをインスタンス化してから、すべてのコントローラ関数を実行することができます。 app.jsは、実装する対応するコントローラ機能を持つルートのみを指定する必要があります。

もう少し整理するために、これらのモジュール間の接着剤としてapp.jsを使用してルートを別のモジュールに分岐することも検討できます。

+0

ありがとう!私はそれを試してみましょう。 –

+2

私は好奇心が強いでしょう。 –

+3

https://github.com/cmarin/MongoDB-Node-Express-Blogを管理する方法の例は、上で概説した概念の良い実装です。 – almypal

70

nconfを使用して構成できるように、モデルファイルの外にデータベースを定義するのが好きです。もう一つの利点は、モデルの外でMongo接続を再利用できることです。

module.exports = function(mongoose) { 
    var Material = new Schema({ 
     name    : {type: String, index: true}, 
     id     : ObjectId, 
     materialId   : String, 
     surcharge   : String, 
     colors    : { 
      colorName  : String, 
      colorId   : String, 
      surcharge  : Number 
     } 
    }); 
    // declare seat covers here too 
    var models = { 
     Materials : mongoose.model('Materials', Material), 
     SeatCovers : mongoose.model('SeatCovers', SeatCover) 
    }; 
    return models; 
} 

、あなたはこのようにそれを呼ぶだろう、その後...

var mongoose = require('mongoose'); 
mongoose.connect(config['database_url']); 
var models = require('./models')(mongoose); 
var velvet = new models.Materials({'name':'Velvet'}); 
+14

+1このアプローチの場合。私は個人的にこれを自分で使い、私が唯一だと思った。最終的に私は最初から何かをやっているのが分かりました。 –

+0

モデルファイルでcreateConnectionを使用する必要はありませんか? – alexislg

+0

いいえ、実際にはそうしないと良いと思います。モデルにはモンゴースのオブジェクトが必要です。それは彼らが気にするものです。接続管理を単一の場所で行い、mongooseオブジェクトを「注入する」方が良い。これは、構成管理とコードの再利用のためのベストプラクティスです。 –

関連する問題