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í odeslatmodels
jsou právě to – datové modely ve vaší aplikacimodule.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, comodule.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í!