MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Vuoi avere una chiarezza cristallina sulla struttura dell'app NodeJS (stack JavaScript completo)

Va bene, questa è una domanda piuttosto ampia e non sono sicuramente un esperto, ma farò del mio meglio qui.

TL;DR

  • routes sono controller che indicano quale logica eseguire quando un utente naviga nel proprio browser verso un determinato percorso all'interno dell'app, incluse quali viste eseguire il rendering e quali dati inviare a tali viste
  • models sono proprio questo:modelli di dati all'interno della tua applicazione
  • module.exports = dice a un file cosa esattamente "esporta", ovvero quale codice deve essere eseguito o accessibile dal file dell'app principale.
  • require(..) include un modulo. Puoi impostarlo su una variabile in modo da poter chiamare le funzioni del modulo in un secondo momento, o semplicemente eseguire una funzione se questo è tutto ciò che module.exports ritorna.

La combinazione di queste tecniche può aiutarti a definire una solida struttura per qualsiasi tua applicazione.

Risposta lunga

Express fornisce un solido framework per strutturare la tua applicazione Node.js. Node è completamente indipendente da Express, ma a causa della popolarità di Express, praticamente vanno di pari passo. Una volta installato, Express può essere utilizzato per generare un progetto web scaffold (con opzioni) su cui costruire se lo desideri.

Titolari

Un progetto generato creerà /routes/index.js , che (se capisci MVC) è essenzialmente il tuo controllore principale . Un percorso in express è scritto così:

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

Analizziamolo:alla nostra variabile dell'applicazione (app) viene detto che su una richiesta GET a '/path' per eseguire una funzione di callback anonima con req, res, next variabili (rispettivamente richiesta, risposta, callback). Trovo utile pensare a questo come a un gestore di eventi personalizzato.

È importante notare a questo punto che potremmo anche chiamare app.post con la stessa sintassi per i post su un URL rispetto a gets.

All'interno della nostra richiamata anonima, gestiamo tutti i dati in arrivo e offriamo una vista per l'utente. È qui che finisce la maggior parte della mia logica aziendale, quindi in realtà ha senso NON utilizzare funzioni anonime qui. Ecco un esempio di richiamata di base che mostra solo una home page:

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

    //some business logic

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

Quando l'utente tenta di OTTENERE il percorso dell'indice della nostra applicazione (/ ), eseguiamo semplicemente il rendering della nostra home vista che, dalla radice del nostro progetto, è memorizzata in un views cartella.

Ma cosa succede se vogliamo modularlo in modo da non dichiarare tutti i nostri percorsi nel nostro app.js principale o server.js ?

Usiamo module.exports = .. nei nostri moduli per dire al nostro server cosa includere esattamente. Nel mio controller, esporto una singola funzione che prende l'applicazione come argomento e la usa per definire i nostri percorsi in questo modo:

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

};

Non preoccuparti del req.db codice, allego il database alla richiesta nella mia applicazione ma ciò non viene eseguito per impostazione predefinita. Comprendi semplicemente che sto ottenendo un elenco di "utenti" qui e reindirizzando l'utente all'indice della mia app se non ce ne sono.

Modelli

Mongoose ci fornisce un'ottima interfaccia per la scrittura di modelli. Con la mangusta, scrivere modelli è un processo in tre fasi:

  • Definisci uno schema
  • Definisci la logica del modello
  • Genera ed esporta il modello

Ecco un esempio di User modello:

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

Applicazione server

module.exports viene utilizzato per aiutarci a definire una certa modularità nella nostra base di codice. Quando eseguiamo un'applicazione nodo, alla fine eseguiamo un singolo file JavaScript (hai già visto quel file con server.js o app.js ).

Per evitare che questo file diventi troppo grande con più modelli e percorsi, utilizziamo require(module) per includere il codice da altri file JS. module nel nostro caso sarebbe un percorso per il modulo che vogliamo richiedere. Se hai la seguente struttura del documento:

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

Per includere il tuo controller utente da app.js , dovresti scrivere:require('./Controllers/User') . Poiché i nostri moduli controller esportano semplicemente funzioni, possiamo chiamare quella funzione immediatamente dopo la nostra istruzione require semplicemente aggiungendo parentesi alla fine (con tutti i parametri richiesti). Includere i miei controller sembra così:

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

Sto passando nell'app effettiva, perché il mio modulo (sotto) esporta semplicemente una funzione che aggiunge la logica aziendale ai percorsi della mia app. Questo deve solo essere chiamato e mai usato, quindi non acquisisco il mio controller come variabile per chiamare i metodi in un secondo momento.

L'inclusione dei modelli è leggermente diversa, poiché potremmo voler eseguire alcune operazioni definite dal nostro modello. Possiamo farlo modificando un po' il nostro codice di richiesta:

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

Ora possiamo chiamare i metodi del nostro modello utente in qualsiasi momento. Mongoose ci offre gratuitamente molte funzionalità di base:

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

La funzione di cui sopra andrà a trovare tutti i nostri utenti, quindi eseguirà una funzione anonima con un potenziale err (è nullo se non ci sono problemi) e quindi un elenco dei nostri utenti in formato JSON. Abbastanza elegante.

Combinando tutti questi concetti è possibile creare un'applicazione Web di base utilizzando Express e Node.js. Per favore fatemi sapere nei commenti se c'è qualcosa che posso chiarire su come utilizzo Express. Questa è una conoscenza molto superficiale e suggerisco di approfondire la documentazione e guardare i plug-in per estendere le capacità delle tue app. Buona fortuna!