MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Möchten Sie sich über die NodeJS-App-Struktur klar werden (vollständiger JavaScript-Stack)

Okay, das ist eine ziemlich weit gefasste Frage und ich bin definitiv kein Experte, aber ich werde hier mein Bestes geben.

TL;DR

  • routes sind Controller, die angeben, welche Logik ausgeführt werden soll, wenn ein Nutzer seinen Browser zu einem bestimmten Pfad innerhalb Ihrer App navigiert, einschließlich, welche Ansichten gerendert und welche Daten an diese Ansichten gesendet werden sollen
  • models sind genau das - Datenmodelle innerhalb Ihrer Anwendung
  • module.exports = teilt einer Datei mit, was genau sie "exportiert", das heißt, welcher Code ausgeführt werden muss oder von Ihrer Hauptanwendungsdatei aus zugänglich sein muss.
  • require(..) enthält ein Modul. Sie können dies auf eine Variable setzen, damit Sie später Modulfunktionen aufrufen können, oder einfach eine Funktion ausführen, wenn das alles ist, was module.exports ist kehrt zurück.

Die Kombination dieser Techniken kann Ihnen dabei helfen, einen soliden Rahmen für jede Ihrer Anwendungen festzulegen.

Lange Antwort

Express bietet ein solides Framework für die Strukturierung Ihrer Node.js-Anwendung. Node ist völlig unabhängig von Express, aber aufgrund der Beliebtheit von Express gehen sie praktisch Hand in Hand. Nach der Installation kann Express verwendet werden, um ein Gerüst-Webprojekt (mit Optionen) zu generieren, auf dem Sie aufbauen können, wenn Sie möchten.

Controller

Ein generiertes Projekt erstellt /routes/index.js , die (wenn Sie MVC verstehen) im Wesentlichen Ihr Hauptcontroller ist . Eine Route in Express wird so geschrieben:

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

Lassen Sie uns das aufschlüsseln:Unsere Anwendungsvariable (app) wird bei einer GET-Anforderung an '/path' darüber informiert um eine anonyme Callback-Funktion mit req, res, next auszuführen Variablen (Request, Response bzw. Callback). Ich finde es hilfreich, sich das wie einen benutzerdefinierten Event-Handler vorzustellen.

Wichtig ist an dieser Stelle anzumerken, dass wir auch app.post aufrufen könnten mit der gleichen Syntax für Posts an eine URL im Gegensatz zu Gets.

Innerhalb unseres anonymen Rückrufs verarbeiten wir alle eingehenden Daten und rendern eine Ansicht für den Benutzer. Hier endet der Großteil meiner Geschäftslogik, daher ist es eigentlich sinnvoll, hier KEINE anonymen Funktionen zu verwenden. Hier ist ein Beispiel für einen einfachen Callback, der nur eine Homepage anzeigt:

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

    //some business logic

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

Wenn der Benutzer versucht, den Indexpfad unserer Anwendung abzurufen (/ ), rendern wir einfach unser home Ansicht, die von der Wurzel unseres Projekts in views gespeichert ist Mappe.

Aber was ist, wenn wir dies modularisieren wollen, sodass wir nicht alle unsere Routen in unserer Haupt-app.js deklarieren oder server.js ?

Wir verwenden module.exports = .. in unseren Modulen, um unserem Server mitzuteilen, was genau aufgenommen werden soll. In meinem Controller exportiere ich eine einzelne Funktion, die die Anwendung als Argument nimmt und damit unsere Routen wie folgt definiert:

Controller/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});
        }
    });

};

Machen Sie sich keine Sorgen um die req.db code, hänge ich die Datenbank an die Anfrage in meiner Anwendung an, aber das wird nicht standardmäßig gemacht. Verstehen Sie einfach, dass ich hier eine Liste von "Benutzern" erhalte und den Benutzer zum Index meiner App umleite, wenn es keine gibt.

Modelle

Mongoose bietet uns eine großartige Schnittstelle zum Schreiben von Modellen. Bei Mungo ist das Schreiben von Modellen ein dreistufiger Prozess:

  • Definieren Sie ein Schema
  • Modelllogik definieren
  • Generieren und exportieren Sie das Modell

Hier ist ein Beispiel für einen User Modell:

Models/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;

Server-App

module.exports wird verwendet, um uns dabei zu helfen, eine gewisse Modularität unserer Codebasis zu definieren. Wenn wir eine Knotenanwendung ausführen, führen wir letztendlich eine einzelne JavaScript-Datei aus (Sie haben diese Datei bereits mit server.js gesehen oder app.js ).

Damit diese Datei bei mehreren Modellen und Routen nicht zu groß wird, verwenden wir require(module) um Code aus anderen JS-Dateien einzufügen. module in unserem Fall wäre das ein Pfad zu dem gewünschten Modul. Wenn Sie die folgende Dokumentstruktur haben:

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

Um Ihren Benutzercontroller aus app.js einzuschließen , würden Sie schreiben:require('./Controllers/User') . Da unsere Controller-Module einfach Funktionen exportieren, können wir diese Funktion direkt nach unserer require-Anweisung aufrufen, indem wir einfach Klammern am Ende hinzufügen (mit allen erforderlichen Parametern). Das Einbinden meiner Controller sieht so aus:

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

Ich übergebe die eigentliche App, weil mein Modul (unten) einfach eine Funktion exportiert, die den Routen meiner App Geschäftslogik hinzufügt. Dies muss nur aufgerufen und nie verwendet werden, also erfasse ich meinen Controller nicht als Variable, um später Methoden aufzurufen.

Das Einschließen von Modellen ist etwas anders, da wir möglicherweise einige Operationen ausführen möchten, die unser Modell definiert. Wir können dies tun, indem wir unseren Anforderungscode ein wenig ändern:

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

Jetzt können wir jederzeit Methoden unseres Benutzermodells aufrufen. Mongoose stellt uns viele Basisfunktionen kostenlos zur Verfügung:

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

Die obige Funktion findet alle unsere Benutzer und führt dann eine anonyme Funktion mit einem potenziellen err aus (ist null, wenn keine Probleme auftreten) und dann eine Liste unserer Benutzer im JSON-Format. Ziemlich raffiniert.

Durch die Kombination all dieser Konzepte erstellen Sie eine einfache Webanwendung mit Express und Node.js. Bitte teilen Sie mir in den Kommentaren mit, ob ich etwas zur Verwendung von Express klären kann. Dies ist sehr oberflächliches Wissen, und ich schlage vor, in die Dokumentation einzutauchen und Plugins zu betrachten, um die Fähigkeiten Ihrer Apps zu erweitern. Viel Glück!