Это было давно, так как аббревиатура 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, и используйте их в своем проекте.