Статьи

Введение в MEAN Stack

Это было давно, так как аббревиатура LAMP (Linux Apache MySql PHP) была создана. Сегодня другим очень распространенным стеком является MEAN-стек. Вероятно, не все из вас знают, что означает аббревиатура «MEAN», поэтому давайте начнем с основного. MEAN означает MongoDB , Express , AngularJS и Node.js. Он занимается полным стеком JavaScript-решения для создания веб-сайтов и веб-приложений. От базы данных до внутреннего кода и внешнего кода все написано с использованием JavaScript. Если вы не знакомы с технологиями, используемыми стеком MEAN, вы можете найти краткое введение в эти технологии в следующем разделе.

Вы можете найти весь исходный код этой статьи на GitHub . Не стесняйтесь раскошелиться и поиграть с ним.

ЖАДНЫЙ

M означает MongoDB , ведущую в мире базу данных NoSQL. Это своего рода база данных типа документа, которая хранит свои данные в отформатированном JSON-формате двоичный файл с именем BSON (Binary JSON). Он прост в использовании, а для разработчиков JavaScript это так же просто, как работать с JSON.

E обозначает Express , легкий, минималистский фреймворк, созданный для Node.js. Он был создан для веб-приложений и API и поставляется с множеством средств HTTP для разработчика.

A обозначает AngularJS , модель-представление-независимо от JS-фреймворка, созданного Google. AngularJS делает использование API настолько простым, насколько это возможно, поэтому использование его в качестве клиентской части MEAN очень полезно для каждого разработчика. Более того, AngularJS оптимизирован для мобильной разработки, поэтому, используя ту же базу кода в браузере, вы уже создали мобильное приложение для разрабатываемого веб-приложения.

N означает Node.js , основа Express. Он работает на движке Chrome V8 и способен к неблокирующим событиям ввода-вывода. Приложение Node.js будет обрабатывать несколько запросов в одном сервисе, не блокируя друг друга (следовательно, не блокируя).

Предпосылки

Перед началом убедитесь, что у вас установлены MongoDB и Node.js. Node.js поставляется с менеджером пакетов npm , который мы будем использовать для управления пакетами (зависимостями). Если у вас есть опыт работы с PHP, npm является эквивалентом Composer , а Packagist будет npmjs.org . Там вы найдете практически эквивалентный пакет для каждого используемого вами пакета PHP, что упрощает переход к веб-приложению Node.js.

Первый Экспресс Сервер

Прежде всего, запустите следующую команду на вашем терминале:

 npm init 

После ответа на вопросы он создаст файл package.json с необходимой информацией. Вот мой:

 { "name": "sp-mean", "version": "0.1.0", "description": "An introduction to MEANstack for SitePoint", "main": "server.js", "scripts": { "start": "node ./server" }, "author": , "license": "None" } 

"main": "server.js" означает, что основным файлом, который будет выполняться на сервере, является server.js .

В качестве второго шага давайте добавим express как зависимость, выполнив команду:

 npm install express --save 

Это добавит каталог node_modules котором хранятся зависимости. Имейте в виду, что вы должны игнорировать эту папку из-за контроля версий.

На этом этапе следующим шагом является написание приложения Express, которое будет действовать как сервер:

 var express = require('express'), app = express(); app.get('/', function(req, res) { res.send("Hello from Express"); }); app.listen(3000, function() { console.log("Server ready. Listening on port 3000"); }); 

npm start команду npm start сервер перейдет на http: // localhost: 3000 и отправит Hello from Express когда вы перейдете к индексу.

Использование MongoDB

Чтобы использовать MongoDB из приложения Express, мы собираемся использовать пакет от npmjs.com . Существует длинный список пакетов, которые вы можете использовать, включая mongodb , monk или mongoose . Для этого примера я буду использовать монаха. Чтобы начать его установку, выполните команду:

 npm install monk --save 

А затем запустите консоль Mongo, выполнив

 mongo 

Теперь вставьте некоторые данные в Mongo, выполнив:

 use starwars; db.character.insert({ name: "Luke", surname: "Skywalker", side: "Light", weapon: "Lightsaber" }); db.character.insert({ name: "Yoda", side: "Light", weapon: "Lightsaber" }); db.character.insert({ sith_name: "Vader", side: "Dark", weapon: "Lightsaber" }); db.character.insert({ sith_name: "Sidious", side: "Dark", weapon: "Force lightning" }); 

Этого должно быть достаточно для нашей коллекции. Как видите, нам не нужно устанавливать одинаковые ключи для всех записей: у Люка и Мастера Йоды нет имени sith_name . Это допустимо в MongoDB, так как это без схемы; до тех пор, пока вы вставляете легальные объекты JavaScript, все в порядке.

Теперь мы можем использовать monk чтобы получить данные из базы данных и показать их пользователю.

Во-первых, требуется зависимость в верхней части server.js :

 var monk = require('monk'); 

Теперь получите ссылку на коллекцию, которую мы создали ранее:

 var swChars = monk('localhost:27017/starwars').get('character'); 

Это также можно записать так:

 var db = monk('localhost:27017/starwars'); var swChars = db.get('character'); 

Первая строка кода дает вам ссылку на базу данных ( starwars ) в случае, если вам нужно использовать более одной коллекции. Затем мы get() ссылку на коллекцию, которую мы используем, коллекцию character .

Теперь давайте дадим пользователю полный список символов, которые мы сохраняем, когда он просматривает /character :

 app.get('/character', function (req, res) { swChars.find({}, function (err, docs) { if (err == null) { res.json(docs); } else { console.log(err); } }); }); 

Используя функцию find() , мы запрашиваем коллекцию, на которую ссылается swChars . Первый параметр — это правила запроса, но, поскольку мы показываем все символы, я поместил туда пустой объект JavaScript. Второй параметр — это функция обратного вызова, выполняемая после того, как записи были извлечены из коллекции базы данных.

Мы можем показать некоторые записи, скажем, только рыцарей джедаев, выполнив запрос side :

 app.get('/jedi', function (req, res) { swChars.find({side: "Light"}, function (err, docs) { if (err == null) { res.json(docs); } else { console.log(err); } }); }); 

Monk охватывает множество функций, которые помогут вам использовать базу данных Mongo. Проверьте его репозиторий GitHub для получения дополнительной информации о том, как использовать монаха .

AngularJS во внешнем интерфейсе

Создание бэк-энда было простым. Не слишком много стандартного кода, простых маршрутов API и действительно простых данных. Теперь, чтобы показать эту информацию пользователю, мы будем использовать AngularJS.

Используйте Bower, чтобы получить AngularJS:

 # create a bower.json file to store dependencies bower init bower install angular#1.4.3 --save 

Для клиентской части создайте эти файлы / папки:

 активы / JS / ngapp.js
 активы / JS / контроллеры
 активы / JS / услуги

Первое — это базовое приложение AngularJS, которое мы создаем. Второй — это каталог, в котором будут находиться контроллеры, а третий — каталог, в котором будут находиться службы (например, фабрики). Чтобы создать базовое приложение Angular, поместите его в ngapp.js :

 var app = angular.module('starwars', []); 

Не забудьте включить это в файл index.html .

Теперь, чтобы получить данные из внутреннего API, мы создадим фабрику. Создайте файл с именем StarWarsFactory.js в папке services :

 app.factory('StarWarsFactory', function ($http) { return { characters: function () { return $http.get('/character'); }, jedi: function () { return $http.get('/jedi'); } } }); 

Теперь, чтобы использовать это, добавьте простой контроллер MainCtrl.js :

 app.controller('MainCtrl',function(StarWarsFactory) { var self = this; StarWarsFactory.characters().success(function(data) { self.charList = data; }); }); 

Включите все эти файлы JS в файл index.html и поместите этот div чтобы показать данные, полученные с сервера:

 <div ng-controller="MainCtrl as m"> <ul> <li ng-repeat="item in m.charList"> <span ng-if="item.side === 'Light'"> {{item.name}} {{item.surname}} uses {{item.weapon}} </span> <span ng-if="item.side === 'Dark'"> Darth {{item.sith_name}} uses {{item.weapon}} </span> </li> </ul> </div> 

Наконец, чтобы обслужить это из приложения Express, вы должны удалить тот / route, который показывает только «Hello from Express», и поместить этот фрагмент кода вместо этого:

 app.use('/', express.static(__dirname + '/')); app.get('/', function (req, res) { res.sendFile(path.join(__dirname + "/index.html")); }); 

Когда вы перейдете к localhost:3000 , вы увидите список персонажей и их оружие выбора.

Выводы

В этой статье мы узнали, как создать простое приложение, используя стек под названием MEAN. Мы использовали Mongo для хранения данных в виде объектов JavaScript, Express в бэкэнде для построения API и AngularJS во внешнем интерфейсе в качестве клиента API.

Вы можете найти весь исходный код этой статьи на GitHub . Не стесняйтесь раскошелиться и поиграть с ним.

Наконец, вы должны знать, что существует много генераторов для MEAN. В этой статье я подумал о том, чтобы не использовать генератор, чтобы облегчить начинающим начинающим работу в MEAN. Если вы более опытны с MEAN, проверьте любой генератор, такой как mean.io , генератор Yeoman или даже генератор Express, и используйте их в своем проекте.