sql >> Databáze >  >> NoSQL >> MongoDB

Chcete získat křišťálově jasnou strukturu aplikace NodeJS (Full JavaScript Stack)

Dobře, to je docela široká otázka a rozhodně nejsem žádný odborník, ale udělám, co bude v mých silách.

TL;DR

  • routes jsou řadiče, které říkají, jakou logiku provést, když uživatel přejde svůj prohlížeč na určitou cestu ve vaší aplikaci, včetně toho, která zobrazení se mají vykreslit a jaká data do těchto zobrazení odeslat
  • models jsou právě to – datové modely ve vaší aplikaci
  • module.exports = říká souboru, co přesně „exportuje“, to je to, jaký kód musí být spuštěn nebo zpřístupněn z vašeho hlavního souboru aplikace.
  • require(..) obsahuje modul. Můžete to nastavit na proměnnou, abyste mohli později volat funkce modulu, nebo jednoduše spustit funkci, pokud je to vše, co module.exports se vrací.

Kombinace těchto technik vám může pomoci vytvořit pevný rámec pro jakoukoli z vašich aplikací.

Dlouhá odpověď

Expresní poskytuje pevný rámec pro strukturování vaší aplikace Node.js. Node je zcela nezávislý na Expressu, ale kvůli tomu, jak populární je Express, jdou prakticky ruku v ruce. Po instalaci lze Express použít ke generování webového projektu lešení (s možnostmi), na kterém můžete, pokud chcete, stavět.

Ovladače

Vygenerovaný projekt vytvoří /routes/index.js , což (pokud rozumíte MVC) je v podstatě váš hlavní řadič . Trasa v expresu je zapsána takto:

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

Pojďme si to rozebrat:naší aplikační proměnné (aplikaci) se to říká na požadavek GET na '/path' pro provedení anonymní funkce zpětného volání pomocí req, res, next proměnné (požadavek, odpověď, zpětné volání). Považuji za užitečné uvažovat o tom jako o vlastní obsluze událostí.

V tomto bodě je důležité poznamenat, že bychom mohli také nazvat app.post se stejnou syntaxí pro příspěvky na adresu URL jako pro get.

V rámci našeho anonymního zpětného volání zpracováváme všechna příchozí data a poskytujeme pohled pro uživatele. Tady končí většina mé obchodní logiky, takže vlastně dává smysl NEPOUŽÍVAT zde anonymní funkce. Zde je příklad základního zpětného volání, které pouze zobrazí domovskou stránku:

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

    //some business logic

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

Když se uživatel pokusí ZÍSKAT cestu indexu naší aplikace (/ ), jednoduše vykreslíme náš home pohled, který je z kořene našeho projektu uložen v views složku.

Ale co když to chceme modularizovat, abychom nedeklarovali všechny naše trasy v našem hlavním app.js nebo server.js ?

Používáme module.exports = .. v našich modulech, abychom našemu serveru řekli, co přesně má zahrnout. V mém řadiči exportuji jednu funkci, která bere aplikaci jako argument a používá ji k definování našich tras takto:

Ovladače/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});
        }
    });

};

Nedělejte si starosti s req.db kódu, připojím databázi k požadavku v mé aplikaci, ale to se ve výchozím nastavení nedělá. Jednoduše pochopte, že zde dostávám seznam „uživatelů“ a přesměruji uživatele na index mé aplikace, pokud tam žádný není.

Modely

Mongoose nám poskytuje skvělé rozhraní pro psaní modelů. U mongoose je psaní modelů třístupňový proces:

  • Definujte schéma
  • Definujte logiku modelu
  • Vygenerujte a exportujte model

Zde je příklad User model:

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

Serverová aplikace

module.exports se používá, aby nám pomohl definovat určitou modularitu naší kódové základny. Když spustíme aplikaci uzlu, nakonec spustíme jeden soubor JavaScript (tento soubor jste již viděli s server.js nebo app.js ).

Aby se tento soubor příliš nezvětšil s více modely a trasami, používáme require(module) zahrnout kód z jiných souborů JS. module v našem případě by to byla cesta k modulu, který chceme vyžadovat. Pokud máte následující strukturu dokumentu:

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

Chcete-li zahrnout uživatelský ovladač z app.js , napsali byste:require('./Controllers/User') . Vzhledem k tomu, že naše řídicí moduly jednoduše exportují funkce, můžeme tuto funkci zavolat ihned po našem příkazu require jednoduchým přidáním závorek na konec (s jakýmikoli požadovanými parametry). Včetně mých ovladačů vypadá takto:

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

Předávám skutečnou aplikaci, protože můj modul (níže) jednoduše exportuje funkci, která přidává obchodní logiku do tras mé aplikace. Toto je pouze potřeba zavolat a nikdy to nepoužít, takže svůj kontrolér nezachycuji jako proměnnou pro pozdější volání metod.

Zahrnutí modelů je trochu jiné, protože možná budeme chtít provést nějakou operaci, kterou náš model definuje. Můžeme to udělat tak, že jen trochu změníme požadovaný kód:

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

Nyní můžeme volat metody našeho uživatelského modelu kdykoli. Mongoose nám zdarma poskytuje spoustu základních funkcí:

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

Výše uvedená funkce najde všechny naše uživatele a poté provede anonymní funkci s potenciálním err (je null, pokud nejsou žádné problémy) a poté seznam našich uživatelů ve formátu JSON. Docela šikovné.

Kombinací všech těchto konceptů vytvoříte základní webovou aplikaci pomocí Express a Node.js. Prosím, dejte mi vědět v komentářích, pokud mohu něco objasnit ohledně toho, jak používám Express. Jedná se o znalosti na velmi povrchové úrovni a doporučuji prozkoumat dokumentaci a podívat se na pluginy, abyste rozšířili možnosti svých aplikací. Hodně štěstí!




  1. Jak změnit název kolekce v mongoose.model?

  2. Najít a vrátit první odpovídající vnořený dokument z pole (Meteor / Mongo)

  3. Jak exportovat klíče Redis jako CSV pomocí CLI

  4. jak zobrazit data z dokumentu do index.phtml v zf2?