2016-07-18 10 views
2

私のコードは機能しますが、脂肪モデルとスキニーコントローラを持つことが最善であると理解しています。nodejsコードの構造はどうですか?脂肪モデル/スキニーコントローラ

しかし、私は3つの異なるモデルを使用しており、残念なことに私のコントローラを脂肪にしました。このコードを(脂肪モデル/スキニーコントローラのコンセプトで)整理する最良の方法は何ですか?私はコード構造について読んできましたが、私はベストプラクティスを少しは確信しています。

コントローラー:

var Product = require('../models/product'); 
var Collection = require('../models/collection'); 
var Vote = require('../models/vote'); 

exports.topSearch = function(req, res) { 
    console.log(req.body, "search product") 

    Product.search({ 
     query_string: { 
     query: req.body.search 
     } 
    },req.body.searchObject, 
    function(err, results) { 
     if (err) console.log('ERR', err); 
     if (results) { 
     var data = results.hits.hits; 

     Vote.find({ 
      user: req.user._id 
     }, function(err, votes) { 
      if (!err) { 
      for (var i = 0; i < votes.length; i++) { 
       for (var j = 0; j < data.length; j++) { 
       if (data[j]['_id'] == votes[i]['product']) { 
        data[j]['voteId'] = votes[i]['_id']; 
        data[j]['userVote'] = votes[i]['vote']; 
       } 
       } 
      } 
      } 

     Collection.find({ 
      user: req.user._id 
     }, function(err, collections) { 
      if (!err) { 
      for (var i = 0; i < collections.length; i++) { 
       for (var j = 0; j < data.length; j++) { 
       if (data[j]['_id'] == collections[i]['product']) { 
        console.log('match') 
        data[j]['collected'] = true; 
        data[j]['collectId'] = collections[i]['_id']; 
        data[j]['favorite'] = collections[i]['favorite']; 
       } else if (data[j]['_id'] !== collections[i]['product'] && data[j]['collected'] !== true) { 
        data[j]['collected'] = false; 
       } 
       } 
      } 
      res.send(data); 
      } 
     }); 
     }); 

     } else { 
     res.send({ 
      errmsg: 'results not defined' 
     }) 
     } 
    }); 
}; 

私はその後、私のルートでこれを呼び出す:

app.post('/products-search', users.ensureAuthenticated, products.topSearch); 

答えて

0

あなたはに関連するすべてのモデルに基づく処理を行うことができますモデルや機能の下に別のファイルを作成することができます"topSearch"を呼び出して、コントローラ内で単一のメソッドを呼び出すだけです。

コールバックとフローをよりうまく処理するには、async.jsのようなものを使用します。

私は個人的にこのレポで定義されたフォルダ構造に従います。

better-node-express-app-structure

そして時々私は複雑さに応じて、モデルとコントローラにサブフォルダを追加します。

頻繁に使用される選択クエリは、再利用を容易にするために独立した関数として直接エクスポートできます。

関連する問題