Добре, това е доста обширен въпрос и определено не съм експерт, но ще дам всичко от себе си тук.
TL;DR
маршрути
са контролери, които казват каква логика да се изпълни, когато потребител навигира в браузъра си до определен път в приложението ви, включително кои изгледи да се изобразят и какви данни да се изпратят до тези изгледимодели
са точно това - модели на данни във вашето приложениеmodule.exports =
казва на файл какво точно „експортира“, т.е. какъв код трябва да бъде изпълнен или достъпен от основния ви файл на приложението.require(..)
включва модул. Можете да зададете това на променлива, така че да можете да извиквате модулни функции по-късно или просто да изпълните функция, ако това е всичко, коетоmodule.exports
се завръща.
Комбинирането на тези техники може да ви помогне да създадете солидна рамка за всяко от вашите приложения.
Дълъг отговор
Express осигурява солидна рамка за структуриране на вашето Node.js приложение. Node е напълно независим от Express, но поради популярността на Express те на практика вървят ръка за ръка. Веднъж инсталиран, Express може да се използва за генериране на уеб проект на скеле (с опции), върху който да надграждате, ако желаете.
Контролери
Генериран проект ще създаде /routes/index.js
, който (ако разбирате MVC) по същество е вашият основен контролер . Маршрут в Express се записва така:
app.get('/path', function(req, res, next){ .. } );
Нека разбием това:нашата променлива на приложението (app) се казва, че при GET заявка към '/path'
за изпълнение на анонимна функция за обратно извикване с req, res, next
променливи (съответно заявка, отговор, обратно извикване). Намирам за полезно да мисля за това като за персонализиран манипулатор на събития.
Важно е да се отбележи в този момент, че можем също да извикаме app.post
със същия синтаксис за публикации към URL, за разлика от gets.
В рамките на нашето анонимно обратно извикване ние обработваме всички входящи данни и изобразяваме изглед за потребителя. Това е мястото, където свършва по-голямата част от моята бизнес логика, така че всъщност има смисъл да НЕ използвам анонимни функции тук. Ето пример за основно обратно извикване, което просто показва начална страница:
app.get('/', function(req, res, next){ //някаква бизнес логика res.render('views/home');});
Когато потребителят се опита да ПОЛУЧИ пътя на индекса на нашето приложение (/
), ние просто изобразяваме нашия дом
изглед, който от основата на нашия проект се съхранява в views
папка.
Но какво ще стане, ако искаме да модулираме това, така че да не декларираме всички наши маршрути в нашия основен app.js
или server.js
?
Използваме module.exports =..
в нашите модули, за да кажем на нашия сървър какво точно да включи. В моя контролер експортирам една функция, която приема приложението като аргумент и го използва, за да дефинира нашите маршрути по следния начин:
Контролери/User.js
module.exports =function(app){ app.get('/users', function(req, res){ var users =req.db.collection('users').find(); if (!users) { console.log("няма намерени потребители"); res.redirect('/'); } else { res.render('users/index', {users :users}); } });};
Не се притеснявайте за req.db
код, прикачвам базата данни към заявката в моето приложение, но това не се прави по подразбиране. Просто разберете, че тук получавам списък с „потребители“ и пренасочвам потребителя към индекса на моето приложение, ако няма такива.
Модели
Mongoose ни предоставя страхотен интерфейс за писане на модели. С mongoose писането на модели е процес от три стъпки:
- Дефиниране на схема
- Дефинирайте логиката на модела
- Генерирайте и експортирайте модела
Ето пример за Потребител
модел:
Models/User.js
var mongoose =require('mongoose'), userSchema =new mongoose.Schema({ name:{ type:String, required:true }, joinDate:{type:Date, default:date.now } } ), Потребител =mongoose.model('user', userSchema);module.exports =user;
Сървърно приложение
module.exports
се използва, за да ни помогне да дефинираме известна модулност на нашата кодова база. Когато стартираме приложение за възел, в крайна сметка изпълняваме единичен JavaScript файл (вече сте виждали този файл с server.js
или app.js
).
За да не стане този файл твърде голям с множество модели и маршрути, ние използваме require(module)
за включване на код от други JS файлове. модул
в нашия случай ще бъде път към модула, който искаме да изискваме. Ако имате следната структура на документа:
За да включите вашия потребителски контролер от app.js
, бихте написали:require('./Controllers/User')
. Тъй като нашите контролерни модули просто експортират функции, можем да извикаме тази функция веднага след нашето изискване, като просто добавим скоби в края (с каквито и да са необходими параметри). Включването на моите контролери изглежда така:
require('./Controllers/User')(app)
Предавам действителното приложение, защото моят модул (по-долу) просто експортира функция, която добавя бизнес логика към маршрутите на приложението ми. Това трябва само да се извика и никога да не се използва, така че не улавям моя контролер като променлива, за да извикам методи по-късно.
Включването на модели е малко по-различно, тъй като може да искаме да изпълним някаква операция, която нашият модел дефинира. Можем да направим това, като променим малко нашия изискващ код:
var User =require('./Models/User');
Сега можем да извикваме методи на нашия потребителски модел по всяко време. Mongoose ни дава много базова функционалност безплатно:
User.find({}, функция(грешка, потребители){ .. });
Горната функция ще намери всички наши потребители и след това ще изпълни анонимна функция с потенциална грешка
(е null, ако няма проблеми) и след това списък на нашите потребители във формат JSON. Доста готин.
Комбинирането на всички тези концепции е начинът, по който създавате основно уеб приложение с помощта на Express и Node.js. Моля, уведомете ме в коментарите, ако има нещо, което мога да изясня за това как използвам Express. Това са познания на повърхностно ниво и предлагам да се заровите в документацията и да разгледате добавките, за да разширите възможностите на вашите приложения. Успех!