2

Mein Code funktioniert, aber ich verstehe, dass es am besten ist, dicke Modelle und dünne Controller zu haben.Wie strukturiere ich meinen Nodejs Code? Fettes Modell/Skinny Controller

Allerdings verwende ich 3 verschiedene Modelle und habe leider meinen Controller fett gemacht. Was ist der beste Weg, um diesen Code zu organisieren (mit fetten Modell/Skinny Controller-Konzept)? Ich habe die Code-Struktur gelesen, aber ich bin ein wenig unsicher bezüglich der Best Practices.

Controller:

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' 
     }) 
     } 
    }); 
}; 

ich diese dann in meiner Route nennen:

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

Antwort

0

Sie können eine separate Datei unter Modelle oder Funktionen erstellen, in dem Sie alle Ihre Modell basierte Verarbeitung tun können im Zusammenhang mit "topSearch" und rufen Sie dann einfach eine einzelne Methode in Ihrem Controller auf.

Verwenden Sie etwas wie async.js, um Rückrufe und fließen besser zu handhaben.

Ich persönlich folge der in diesem Repo definierten Ordnerstruktur.

better-node-express-app-structure

Und manchmal füge ich Unterordner in Modelle und Controller von der Komplexität abhängig.

Häufig verwendete Auswahlabfragen können direkt als unabhängige Funktionen exportiert werden, um die Wiederverwendbarkeit zu erleichtern.