MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Vous voulez obtenir une clarté cristalline sur la structure de l'application NodeJS (Pile JavaScript complète)

Très bien, c'est une question assez large et je ne suis certainement pas un expert, mais je ferai de mon mieux ici.

TL;DR

  • routes sont des contrôleurs qui indiquent la logique à exécuter lorsqu'un utilisateur navigue dans son navigateur vers un certain chemin dans votre application, y compris les vues à afficher et les données à envoyer à ces vues
  • models ne sont que cela :des modèles de données dans votre application
  • module.exports = indique à un fichier exactement ce qu'il "exporte", c'est-à-dire quel code doit être exécuté ou accessible à partir de votre fichier d'application principal.
  • require(..) comprend un module. Vous pouvez le définir sur une variable afin de pouvoir appeler les fonctions du module plus tard, ou simplement exécuter une fonction si c'est tout ce que module.exports Retour.

La combinaison de ces techniques peut vous aider à établir un cadre solide pour n'importe laquelle de vos applications.

Réponse longue

Express fournit un cadre solide pour structurer votre application Node.js. Node est complètement indépendant d'Express, mais en raison de la popularité d'Express, ils vont pratiquement de pair. Une fois installé, Express peut être utilisé pour générer un projet Web d'échafaudage (avec des options) sur lequel vous pouvez construire si vous le souhaitez.

Contrôleurs

Un projet généré créera /routes/index.js , qui (si vous comprenez MVC) est essentiellement votre contrôleur principal . Un itinéraire en express s'écrit ainsi :

app.get('/path', function(req, res, next){ .. } );

Décomposons cela :notre variable d'application (app) est informée que lors d'une requête GET à '/path' pour exécuter une fonction de rappel anonyme avec req, res, next variables (demande, réponse, rappel respectivement). Je trouve utile de considérer cela comme un gestionnaire d'événements personnalisé.

Il est important de noter à ce stade que nous pourrions également appeler app.post avec la même syntaxe pour les publications vers une URL que pour les obtentions.

Dans le cadre de notre rappel anonyme, nous traitons toutes les données entrantes et rendons une vue pour l'utilisateur. C'est là que se termine la majeure partie de ma logique métier, il est donc logique de NE PAS utiliser de fonctions anonymes ici. Voici un exemple de rappel de base qui affiche simplement une page d'accueil :

app.get('/', function(req, res, next){

    //some business logic

    res.render('views/home');
});

Lorsque l'utilisateur essaie d'obtenir le chemin d'index de notre application (/ ), nous rendons simplement notre home vue qui, depuis la racine de notre projet, est stockée dans une views dossier.

Mais que se passe-t-il si nous voulons modulariser cela afin que nous ne déclarions pas toutes nos routes dans notre principal app.js ou server.js ?

Nous utilisons module.exports = .. dans nos modules pour dire à notre serveur exactement ce qu'il faut inclure. Dans mon contrôleur, j'exporte une seule fonction qui prend l'application comme argument et l'utilise pour définir nos routes comme suit :

Controllers/User.js

 module.exports = function(app){

    app.get('/users', function(req, res){
        var users = req.db.collection('users').find();
        if (!users) {
            console.log("no users found");
            res.redirect('/');
        } else {
            res.render('users/index', {users : users});
        }
    });

};

Ne vous inquiétez pas pour le req.db code, j'attache la base de données à la requête dans mon application mais ce n'est pas fait par défaut. Comprenez simplement que je reçois ici une liste d'"utilisateurs" et que je redirige l'utilisateur vers l'index de mon application s'il n'y en a pas.

Modèles

Mongoose nous fournit une excellente interface pour écrire des modèles. Avec mongoose, l'écriture de modèles est un processus en trois étapes :

  • Définir un schéma
  • Définir la logique du modèle
  • Générer et exporter le modèle

Voici un exemple d'un User modèle :

Modèles/User.js

var mongoose = require('mongoose'),
    userSchema = new mongoose.Schema({

        name: { type: String, required: true },
        joinDate: {type: Date, default: date.now }

    }),
    User = mongoose.model('user', userSchema);

module.exports = user;

Application serveur

module.exports est utilisé pour nous aider à définir une certaine modularité dans notre base de code. Lorsque nous exécutons une application de nœud, nous exécutons finalement un seul fichier JavaScript (vous avez déjà vu ce fichier avec server.js ou app.js ).

Pour éviter que ce fichier ne devienne trop volumineux avec plusieurs modèles et routes, nous utilisons require(module) pour inclure le code d'autres fichiers JS. module dans notre cas serait un chemin vers le module que nous voulons exiger. Si vous avez la structure de document suivante :

| Controllers
    - User.js
| Models
    - User.js
| Views
app.js

Pour inclure votre contrôleur utilisateur depuis app.js , vous écririez :require('./Controllers/User') . Étant donné que nos modules de contrôleur exportent simplement des fonctions, nous pouvons appeler cette fonction immédiatement après notre instruction require en ajoutant simplement des parenthèses à la fin (avec les paramètres requis). L'inclusion de mes contrôleurs ressemble à ceci :

require('./Controllers/User')(app)

Je passe dans l'application réelle, car mon module (ci-dessous) exporte simplement une fonction qui ajoute une logique métier aux itinéraires de mon application. Cela doit seulement être appelé et jamais utilisé, donc je ne capture pas mon contrôleur en tant que variable pour appeler des méthodes plus tard.

L'inclusion de modèles est un peu différente, car nous pouvons vouloir effectuer une opération définie par notre modèle. Nous pouvons le faire en modifiant légèrement notre code requis :

var User = require('./Models/User');

Maintenant, nous pouvons appeler les méthodes de notre modèle User à tout moment. Mongoose nous offre gratuitement de nombreuses fonctionnalités de base :

User.find({}, function(err, users){ .. });

La fonction ci-dessus ira trouver tous nos utilisateurs, puis exécutera une fonction anonyme avec un potentiel err (est nul si aucun problème) puis une liste de nos utilisateurs au format JSON. Assez chouette.

En combinant tous ces concepts, vous créez une application Web de base à l'aide d'Express et de Node.js. S'il vous plaît laissez-moi savoir dans les commentaires s'il y a quelque chose que je peux clarifier sur la façon dont j'utilise Express. Il s'agit de connaissances très superficielles, et je suggère de creuser dans la documentation et d'examiner les plugins pour étendre les capacités de vos applications. Bonne chance !