Настройка приложения может быть похожа на создание холста. Вы очень увлечены рисованием, но вам нужно натянуть холст на рамку и скрепить его скобами, когда вы действительно хотите просто приступить к рисованию. Этот краткий справочник должен помочь вам быстро заложить основу, чтобы вы могли делать то, что вы действительно хотите делать, создавая потрясающие приложения.

В первой части этой серии блогов вы найдете все шаги по созданию приложения. Части 2 и 3 помогут вам настроить приложение CRUD в React и Ruby on Rails соответственно.

Начните с создания каталога, в котором будет выполняться загрузка вашего экспресс-приложения. Я назову свой app-template. CD в ​​нужный каталог с вашего терминала и запустите:

mkdir app-template/

компакт-диск в app-template/ и установите все следующее с вашего терминала. Это даст вам все необходимое для запуска экспресс-приложения.

express -e 
npm install 
npm install connect 
npm install mongoose
npm install method-override

Затем запустите нодмон.

nodemon

В браузере перейдите на localhost:3000. Если nodemon запущен, в вашем браузере есть это:

У нас есть работающее экспресс-приложение, но на данный момент оно не очень интересное. Прежде чем продолжить, давайте создадим базу данных. Перейдите на сайт mlab.com и создайте учетную запись. После входа в систему создайте новую базу данных.

Если вы не хотите раскошелиться, выберите «один узел» в следующем меню, затем выберите опцию «песочница» для вашей бесплатной базы данных.

Дайте ему имя. Я называю свою «смертную битву», потому что я люблю Mortal Kombat, и вы ничего не можете с этим поделать. Затем нажмите «Новое развертывание Mongo» и вуаля! У вас есть база данных.

Перед подключением к нашей базе данных мы хотим добавить пользователя в нашу базу данных. Нажмите «Добавить пользователя базы данных» и создайте тестовое фиктивное имя пользователя и пароль. Не используйте свое личное имя пользователя и пароль! Это поддельный пользователь, которого мы создаем для нашего приложения. Убедитесь, что флажок "Только для чтения" не установлен.

Теперь, когда у нас есть пользователь, давайте подключим нашу базу данных к нашему приложению. В терминале введите следующее, чтобы открыть ваш .bash_profile (используя Sublime Text Editor):

subl ~/.bash_profile

В MLab скопируйте указанный uri-адрес подключения и вставьте его в свой профиль bash, заменив ‹dbuser›:‹dbpassword› информацией о пользователе, которую вы создали для своей базы данных. Введите следующее в свой профиль bash:

export DB_MORTAL_KOMBAT=""

и вставьте следующую ссылку из MLab в кавычки.

Выполните следующую команду, чтобы перезагрузить профиль bash:

source ~/.bash_profile

Далее нам потребуются все наши модули в нашем файле app.js нашего экспресс-приложения. Вставьте следующий код в файл app.js. Функция переопределения метода предотвратит обновление страницы при нажатии кнопки, чтобы мы могли успешно удалять элементы в нашем приложении. Вы можете вставить после существующих строк app.use в ваш файл app.js.

// Require Modules
var connect = require(‘connect’)
var methodOverride = require(‘method-override’)
app.use(methodOverride(function(req, res){
 if (req.body && typeof req.body === ‘object’ && ‘_method’ in req.body) {
 // look in urlencoded POST bodies and delete it
 var method = req.body._method
 delete req.body._method
 return method
 }
}));
// Mongoose connection
var mongoose = require(‘mongoose’);
mongoose.connect(process.env.DB_MORTAL_KOMBAT);

Теперь мы создадим модель для работы. Придерживаясь темы Mortal Kombat, я хочу создать список персонажей, используя персонажей Mortal Kombat. Пользователь должен иметь возможность увидеть полный список персонажей, просмотреть одного персонажа и увидеть его/ее имя, мировоззрение и, возможно, описание их особого приема вместе с фотографией. Пользователи также могут удалять или добавлять других персонажей.

Итак, помня об этой пользовательской истории, создайте каталог «models». Создайте файл «character.js» в каталоге моделей. В этом коде нам нужно будет потребовать mongoose и экспортировать наш объект персонажа. Вставьте следующий код в файл character.js:

var mongoose = require(‘mongoose’);
var characterSchema = new mongoose.Schema({
 name: { type: String, required: true},
 alignment: { type: String, required: true},
 special_move: {type: String }
 image_url: { type: String }
});
var Character = mongoose.model(‘Character’, characterSchema);
module.exports = Character;

Теперь в нашем файле маршрутов мы настроим маршруты RESTful, чтобы пользователи могли создавать, читать, обновлять и удалять элементы в нашем приложении. Вам нужно будет потребовать модель в ваших маршрутах. Используйте следующий код в index.js в вашем каталоге маршрутов (вы можете заменить любой существующий код) для шаблона 7 маршрутов RESTful.

var express = require(‘express’);
var router = express.Router();
var Recipe = require(‘../models/character’);
//GET
router.get(‘/’, function(req, res, next) {
 //get index view — list of all characters
 res.render('index', { title: 'Mortal Kombat Karacters' })
});
//NEW
router.get(‘/new’, function(req, res, next) {
 //create new character form
});
//SHOW
router.get(‘/’, function(req, res, next) {
 //show specific character
});
//EDIT
router.get(‘/:id/edit’, function(req, res, next) {
 //get edit character form
});
//CREATE
router.post(‘/’, function(req, res, next){
 // redirect to index
});
//UPDATE
router.patch(‘/:id’, function(req, res, next){
 // redirect to show view
});
//DELETE
router.delete(‘/:id’, function(req, res, next){
 // delete specific character and redirect back to index
});
module.exports = router;

Вы можете увидеть в комментариях, что мы собираемся делать с каждым из этих маршрутов. Ответ рендеринга в нашем первом маршруте get изменит нашу домашнюю страницу, чтобы она выглядела следующим образом. Запустите сервер nodemon еще раз, чтобы увидеть результаты:

Ладно, теперь будем готовить! Все еще мало что можно сделать с тем, что у нас есть, поэтому давайте теперь настроим наше приложение так, чтобы оно отображало список символов и давало нам возможность добавлять новые.

Мы начнем с настройки нашего маршрута get, чтобы найти список всех символов:

router.get(‘/’, function(req, res, next) {
 Character.find({}, function(err, characters){
 if (err) console.log(err);
 res.render(‘index’, { title: ‘Mortal Kombat Karacters’, characters: characters });
 })
});

Но мы еще не создали никаких персонажей, поэтому теперь давайте создадим новое представление с формой для создания персонажа.

В каталоге «views» создайте новый файл .ejs. Вставьте следующий код.

<!DOCTYPE html>
<html>
 <head>
 <title><%= title %></title>
 <link rel=’stylesheet’ href=’/stylesheets/style.css’ />
 </head>
 <body>
 <h1>Kreate a Karacter</h1>
 <form method=”post” action=”/”>
 <input type=”text” name=”name” placeholder=”Karacter Name”>
 <input type=”text” name=”alignment” placeholder=”Alignment”>
 <input type=”text” name=”special_move” placeholder=”Special Move”>
 <input type=”text” name=”image_url” placeholder=”Image URL”>
 <input type=”submit” value=”submit”>
 </form>
 </body>
</html>

посетите http://localhost:3000/new и проверьте свое приложение, у вас должна быть такая форма:

Прежде чем мы сможем добавить персонажа, нам нужно настроить наш почтовый маршрут, чтобы он принимал информацию формы. Настройте свой почтовый маршрут следующим образом:

router.post(‘/’, function(req, res, next){
 // create a character then redirect to index
 var newCharacter = new Character({
 name: req.body.name,
 alignment: req.body.alignment,
 special_move: req.body.special_move,
 image_url: req.body.image_url
 });
 newCharacter.save(function(err, character){
 if (err) console.log(err);
 res.redirect(‘/’);
 });
});

Это возьмет информацию из формы и сохранит ее в базе данных, но нам все еще нужно настроить наше представление index.ejs, чтобы мы могли видеть наш новый персонаж на экране. Добавьте в тело index.ejs следующий код:

<h2>Karacters:</h2>
 <% characters.forEach(function(character) { %>
 <a href=”/<%= character._id %>”><h3><%= character.name %></h3></a>
 <img src= “<%= character.image_url %>” alt=”<%= character.name %>”>
 <% }) %>

Теперь наше представление умеет просматривать всех персонажей в базе данных и отображать их изображение и имя на главной странице. Перейдите на http://localhost:3000/new, чтобы создать нового персонажа, используя нашу форму. После отправки их фото и имя должны появиться на главной странице. Вы также можете проверить MLab и увидеть каждый объект персонажа, появляющийся в ваших коллекциях. Их имя будет ссылаться на соответствующие страницы, но мы еще не настроили это.

Сладкий! У нас есть наш первый символ и буква «C» в нашем приложении CRUD. Попробуйте добавить еще несколько для удовольствия! Уличного бойца здесь нет!

Пока что на нашей домашней странице перечислены все наши персонажи, и мы можем добавлять новых, но теперь давайте сделаем так, чтобы мы могли просматривать отдельные символы и заботиться о «R» в нашем приложении CRUD.

Настройте маршрут показа следующим образом:

router.get(‘/:id’, function(req, res, next) {
 var id = req.params.id;
 Character.findOne({_id: id }, function(err, character){
 if (err) console.log(err);
 res.render(‘show’, {title: 'Mortal Kombat Karacters', character: character})
 })
});

Это ищет вашего персонажа по его идентификатору, который удобно назначается каждому персонажу в MLab. Однако представления у нас пока нет, поэтому в каталоге представлений создайте файл show.ejs и дайте ему следующий код.

<!DOCTYPE html>
<html>
 <head>
 <title><%= title %></title>
 <link rel=’stylesheet’ href=’/stylesheets/style.css’ />
 </head>
 <body>
 <h1><%= title %></h1>
 <h2><%= character.name %></h2>
 <img src= “<%= character.image_url %>” alt=”<%= character.name %>”>
 <p><%= character.alignment %></p>
 <p><%= character.special_move %></p>
 </body>
</html>

Бум! Теперь мы можем просматривать информацию об отдельных персонажах. Но что, если вы облажались и сказали, что случайно поставили персонажа Street Fighter вместо персонажа Mortal Kombat. Что ж, лучше бы у нас был способ отредактировать вашу ошибку, поэтому начните с настройки маршрута редактирования следующим образом, чтобы просмотреть страницу редактирования для отдельного персонажа:

router.get(‘/:id/edit’, function(req, res, next) {
 var id = req.params.id;
 Character.findOne({_id: id }, function(err, character){
 if (err) console.log(err);
 res.render(‘edit’, {title: ‘Mortal Kombat Karacters’, character: character})
 })
});

Затем настройте маршрут обновления таким образом, чтобы ваша база данных и приложение обновлялись с учетом всех внесенных нами изменений.

router.patch(‘/:id’, function(req, res, next) {
 Character.findByIdAndUpdate(req.params.id, req.body, function(err, character){
 if (err) console.log(err);
 res.redirect(‘/’ + req.params.id);
 })
});

Теперь создайте файл edit.ejs в папке представлений и используйте следующий код:

<!DOCTYPE html>
<html>
 <head>
 <title><%= title %></title>
 <link rel=’stylesheet’ href=’/stylesheets/style.css’ />
 </head>
 <body>
 <h1><%= title %></h1>
 <h2><%= character.name %></h2>
 <img src= “<%= character.image_url %>” alt=”<%= character.name %>”>
 <p><%= character.alignment %></p>
 <p><%= character.special_move %></p>
 <form method=”post” action=”/<%= character._id %>”>
 <input type=”hidden” name=”_method” value=”patch”>
 <input type=”text” name=”name” placeholder=”<%= character.name %>”>
 <input type=”text” name=”alignment” placeholder=”<%= character.alignment %>”>
 <input type=”text” name=”special_move” placeholder=”<%= character.special_move %>”>
 <input type=”text” name=”image_url” placeholder=”<%= character.image_url %>”>
 <input type=”submit” value=”Update”>
 </form>
 </body>
</html>

Сладко, теперь вы можете редактировать персонажей и менять этого дурацкого персонажа из Street Fighter, которого вы туда случайно вставили, обратно в персонажа Mortal Kombat. Итак, теперь у нас есть «CRU» и хлам. Наконец, кнопка удаления.

Мы можем просто добавить эту часть в наше представление show.ejs, добавив эту форму внизу:

<form action=’/<% character._id %>” method=”post”>
 <input type=”hidden” name=”_method” value=”delete”>
 <input type=”submit name=”Delete me” value="Delete Karacter">
</form>

затем настройте наш маршрут удаления следующим образом:

router.delete(‘/:id’, function(req, res, next){
 // delete specific character and redirect back to index
 Character.findByIdAndUpdate(req.params.id, req.body, function(err, character){
 if (err) console.log(err);
 res.redirect(‘/’ + req.params.id);
 })
});

Теперь просмотрите отдельного персонажа и нажмите кнопку удаления, чтобы удалить его из базы данных и приложения.

Безупречная победа! У вас есть полностью RESTful CRUD-приложение в экспресс-версии! Вы определенно захотите стилизовать это приложение и рассмотреть возможность объединения некоторых ваших представлений для лучшего взаимодействия с пользователем, но это должно дать вам все необходимое для начала работы! А теперь попробуйте выполнить кодовое задание и сохраните свои навыки JavaScript на высоте, как шляпа Кунг Лао.

ПРОВЕРЬТЕ СВОЮ МОЩНОСТЬ: Kombat Kase

Mortal Kombat — супер крутая видеоигра, известная своим огромным количеством жестокой графики. C не так круты, как K в Mortal Kombat, поэтому напишите какой-нибудь код, чтобы заменить все c в строке с K, поддерживающим верхнюю и нижнюю kase. Если вы хотите быть менее сумасшедшим, сделайте свой код более надежным, чтобы он заменял C только в том случае, если это первая буква слова.

Следите за обновлениями во второй и третьей частях этой серии блогов, в которых мы создаем CRUD-приложение, используя интерфейсный фреймворк REACT, а другое — с Ruby on Rails.