Рубрики
Без рубрики

Выйти из земли с Express.js

Виктором OfoEgbu составляют с земли с Express.jswriting веб-приложения с Node.js Frameworka Общий момент правды – это когда вы разрабатываете много приложений, которые нуждаются в одинаковых или идентичных функциональности. Теперь очевидно, что копирование и код вставки не масштабируемы – тебе нужно

Виктором ОфОЭГБУ

Написание веб-приложений с Node.js Framework

Общий момент истины – это когда вы разрабатываете много приложений, которые нуждаются в одинаковых или идентичных функциональности. Теперь очевидно, что копирование и код вставки не масштабируемы – вам нужен инструмент, который был сделан для гибкости, минимальности и повторного использования.

Вот где экспресс сидит в стеке Mern. Это каркас Node.js для построения масштабируемых веб-приложений.

В этом посте мы пойдем в глубокое встроенные веб-приложения с экспресс-каркасом. Мы посмотрим на интеграцию баз данных, сеансы и файлы cookie, шаблонные двигатели для затвердевания нашего рабочего процесса и, наконец, проблемы производства и безопасности.

Этот учебник требует, чтобы вы установили Node.js и NPM, и вы должны иметь базовое понимание Node.js и JavaScript в целом. Если вы не знакомы с Node.js, вот мой последний пост: Единственные Nodejs введение вам когда-либо понадобится Отказ Это отличное место, чтобы начать погружение в Node.js.

Давайте сделаем Express!

Экспресс был построен TJ Holowaychuk, который получил вдохновение от Ruby on Rails Framework Sinatra. Последняя версия Express – 4.16.1. Express 4 стал легче, отпустив некоторые модули, которые разработчики не всегда использовали. Таким образом, они могли легко импортировать их только тогда, когда им нужно. Имеет смысл верно?

Чтобы начать с Express, вам нужно установить его и требовать Это в вашей программе.

1) Создайте папку под названием Экспресс-приложение , CD в него и ударить NPM init Отказ Это создает наши package.json файл.

2) Все еще на терминале или командной строке, нажмите NPM установить --save Express Отказ Это будет установить экспресс в проект. Double-Dash Сохранить Флаг в основном означает, что мы добавляем его к нашему package.json файл.

3) В корне нашей папки Express-App, создайте Server.js Файл и скопируйте это внутри.

const express = require('express'),
      app = express();

app.get('/',(request,response)=>{
  response.send('Hello world');
});

//Binding the server to a port(3000)
app.listen(3000,()=>console.log('express server started at port 300'));

const (‘Express’), (); app.get (‘/’, (запрос, ответ) => {Resald.send («Привет World ‘);});//Привязка сервера к приложению порту (3000) (3000) .Listen (3000, () => Console.log («Express Server запустился в порту 300»))) ;

4) Вернитесь к терминалу, все еще в той же папке, и нажмите Node Server.js Отказ Перейти к своему браузеру и посетить localhost Отказ

Мы требуем нашего экспресс-модуля. Если бы вы были достаточно наблюдательны, вы, должно быть, заметили, что нам не нужно http . Модуль, как мы делаем в чистых приложениях Node.js. Это потому, что Express требует этого, поэтому нам не нужно делать это снова.

Когда мы требуют ('Express') , что выводит нами, это функция, поэтому мы можем в основном позвонить прямо и назначить его приложение Переменная. На данный момент ничего не собирается работать, пока мы не справляемся с запросом. Это называется Маршрутизация И это означает, что дает клиенту то, о чем они просят.

Экспресс дает нам некоторые основные глаголы для работы HTTP (например, Get, Post, Put и Delete). В нашем примере здесь мы делаем app.get () Метод, который обрабатывает запросы на сервер. Требуется два аргумента: путь запроса и обратного вызова для обработки запроса.

Если вы не получили этого, я объясню больше.

А путь это адрес для ресурса на компьютере. Обратный вызов – это функция, передаваемая другую функцию в качестве аргумента, называемого, когда случаются определенные условия.

Вы можете вспомнить это:

$('p').click(function(){
   console.log('You clicked me')
});

Здесь мы добавляем обратный вызов, когда P нажат. Видеть? Это просто.

На последней строке Server.js , мы слушаем в порту 3000 и Console.log, когда мы запускаем сервер.

Могу поспорить, вы не можете написать приложения с этим. Давайте получим мясистые.

Маршрутизация в экспресс

Маршрутизация означает присвоение функций для ответа на запросы пользователей. Экспресс маршрутизаторы являются в основном промежуточные программы (что означает, что у них есть доступ к CoSert и ответ Объекты и делайте тяжелый подъем для нас).

Маршрутизация в Экспренке следует этот базовый формат:

app.VERB('path', callback…);

Где ГЛАГОЛ ни один из ПОЛУЧАТЬ , ПОЧТА , ПОЛОЖИЛ , а также УДАЛЯТЬ глаголы.

Мы можем добавить столько обратных вызовов, сколько мы желаем. Смотрите пример здесь:

const express = require('express'),
      app = express();
      
function sayHello(request,response,next){
  console.log('I must be called');
  next();
}

app.get('/', sayHello, (request, response)=>{
  response.send('sayHello');
});

app.listen(3000,()=>console.log('Express server started at port 3000'));

Перейти к вашему терминалу или командной строке и нажмите Node Server.js Отказ Вы увидите, что Сайхелло Функциональные пожары до ответа отправляются в браузер.

Сайхелло Функция занимает три аргумента ( Запрос , Ответ и Следующий ).

Далее () Функция, когда вызывается, перемещает управление на следующую промежуточное программное обеспечение или маршрут.

Запрос и объекты ответа

Запрос Объект содержит информацию о входящем запросе. Вот самые полезные свойства и методы:

request.params Переменные хранит объект именованных параметров получения запроса. Например, очистить свой Server.js Файл и вставьте это внутри:

const express = require('express'),
      app = express();
      
app.get('/:name/:age', (request, response)=>{
   response.send(request.params);
});

app.listen(3000,()=>console.log('Express server started at port 3000'));

Запустите это с Node Server.js Затем отправляйтесь в ваш браузер и запустите: https://localhost: 3000/John/5

В указанном выше коде мы получаем переменные от URL и отправляя их в браузер. Дело в том, что request.params это объект, содержащий все те, которые получают параметры. Обратите внимание на двоеточие перед параметрами. Они различают параметры маршрута из обычных путей маршрутов.

request.body Недвижимость магазина параметров пост.

Request.Query Свойство используется для извлечения данных получения формы. Вот пример этого:

1) Создайте другую папку под названием Экспресс-запрос , а затем создать два файла: Server.js и form.html Отказ Вставьте это в Server.js :

const express = require('express'),
      app = express();
      
//route serves both the form page and processes form data
app.get('/', (request, response)=>{
  console.log(request.query);
  response.sendFile(__dirname +'/form.html');
});

app.listen(3000,()=>console.log('Express server started at port 3000'));

2) Скопируйте это на form.html файл:


Запустите код с Node Server.js Хит localhost: 3000 И заполните и отправьте форму в браузере. После отправки формы данные вы заполнены входятся в систему в консоли.

request.Headers Держите ключ/Пары значений запроса, полученного сервером. Серверы и клиенты используют заголовки для передачи их совместимости и ограничения.

request.accepts ([‘Json’, ‘html’]) Удерживает массив форматов данных и возвращает формат, который браузер предпочитает собирать данные в. Мы также увидим это при работе с формами AJAX.

request.url хранит данные о URL запроса.

Запрос. IP: Удерживает адрес IP (Интернет-протокол) браузера, запрашиваемого для информации.

ответ Объект также поставляется с некоторыми удобными методами для получения полезной информации о исходящем запросе.

Ответ.send (сообщение) Отправляет свой аргумент в браузер.

Ответ.json () Отправляет свой аргумент в качестве данных в браузер в формате JSON.

Ответ. Кости (имя, значение, длительность) Предоставляет интерфейс для установки файлов cookie на браузерах. Мы тоже поговорим о куки.

Ответ .edrectirect ([статус перенаправления], URL) Перенаправляет браузер к указанному URL с помощью дополнительного состояния.

Ответ .Render («Файл», {RouteTata: RouteTata}) Оказывает вид на браузер и принимает объект, содержащий данные, может потребоваться маршрутизатор. Вы поймете это лучше, когда мы видим мнение.

Ответ. СООтация (имя, значение) Устанавливает значения заголовка. Но вы не хотите этого делать, так как он впитывается на работу браузера.

Ответ .status (статус) Устанавливает состояние определенного ответа (404, 200, 401 и пр.).

Вам не нужно запоминать все это. Как мы их используем, вы подсознательно освоите их.

Экспресс маршрутизатор

С Express маршрутизатором мы можем нарушить наше приложение на фрагменты, которые могут иметь свои собственные случаи экспресс для работы с. Мы можем их объединить их в очень чистое и модульное путь.

Давайте возьмем, например. Эти четыре случайных URL-адреса:

localhost: 3000/пользователи/John

localhost: 3000/пользователи/Марка

localhost: 3000/посты/newpost

localhost: 3000/API

Наш нормальный подход к этому с экспресс будет:

const express = require('express'),
      app = express();

//Different routes
app.get('/users/john',(request,response)=>{
    response.send(`John's page`);
});

app.get('/users/mark',(request,response)=>{
    response.send(`John's page`);
});

app.get('/posts/newpost',(request,response)=>{
  response.send(`This is a new post`);
});

app.get('/api',(request,response)=>{
  response.send('Api endpoint');
});

app.listen(3000,()=>console.log('Server started at port 3000'));

В этом этапе нет ничего плохого. Но он имеет потенциал для ошибок. Когда наши маршруты в основном всего пять, не так много проблем. Но когда требуется вещи, и требуется много функциональности, вкладывая весь этот код в нашу Server.js не то, что мы хотим сделать.

Мы должны позволить маршрутизатору сделать это для нас

Создайте папку под названием Реагистрационный маршрутизатор В корне нашего проекта создайте файл внутри него и назовите его basic_roouter.js Отказ Скопируйте это прямо в:

const express = require('express'),
      router = express.Router();

//making use of normal routes
router.get('/john',(request,response)=>{
  response.send('Home of user');
});

router.get('/mark',(request,response)=>{
  response.send('Home of user');
});

//exporting thee router to other modules
module.exports = router;

Мы в основном создаем еще один экземпляр экспресс. На этот раз мы называем Маршрутизатор () Функция экспресс. Можно напрямую звонить Express () как функция (как в нашем Server.js ) и позвоните выражать. Маршрутизатор () также. Это связано с тем, что экспресс экспортируется как функция, а в JavaScript функции являются объектами тоже.

Мы добавляем маршруты к нему как нормальное приложение Express. Но мы не связываем это с любым портом. Маршрутизатор Объект содержит все маршруты, которые мы определили, поэтому мы экспортируем только этот объект, чтобы другие части нашей программы могли использовать его тоже.

Мы создаем нашу главную Server.js и добавьте его как промежуточное программное обеспечение. Да, потравленные на работу, помните?

const express = require('express'),
      app = express();

//requiring the basic_router.js
app.use('/users',require('.react-router/basic_router'));

//routes
app.get('/posts/newpost',(request,response)=>{
  response.send('new post');
});

app.get('/api',(request,response)=>{
  response.send('API route');
});

app.listen(3000,()=>console.log('Express server started at port 3000'));

Теперь запустите это. Перейдите к localhost: 3000/пользователь/Джон и localhost: 3000/пользователь/Марка Отказ Видеть? В этот момент все довольно легко группировать.

Мы можем сделать это для каждого другого маршрута. Создайте другой файл для наших API. Мы назовем это API_ROUTE.JS Отказ Скопируйте это прямо в:

const express = require('express'),
      router = express.Router();

router.get('/',(request,response)=>{
  response.send('Home of user');
});

//some other endpoints to submit data
module.exports = router;

Теперь вернитесь к нашему Server.js и изменить код к этому:

const express = require('express'),
      app = express();

app.use('/users',require('./basic_router'));
                         
app.use('/api',require('./api_route'));

app.get('/posts/newpost',(request,response)=>{
   response.send('new post');
});

app.listen(3000,()=>console.log('Express server started at port 3000'));

Это достаточно информации для создания основных веб-маршрутов веб-приложений.

Шаблонные двигатели

Большую часть времени вы не определены в количестве страниц, которые вы хотите иметь свой веб-сайт. Это означает, что вы хотите сохранить вещи гибкими, многоразовыми и чистыми.

Представьте, что у вас есть нижний колонтитул, который вы можете использовать на каждой странице. Разве это не будет круто, если вы просто поместите его в файл и встроить его с линейкой кода на каждой странице? Или как хотелось бы потерять .html на вашем URL?

Это всего лишь несколько вещей, которые могут сделать шаблонные двигатели для нас.

На данный момент много шаблонов для шаблонов. Но мы будем использовать ручки, чтобы увидеть, как работает шаблон. К счастью, достаточно, такие же принципы применяются к почти всему всему шаблону-двигателям – имеются просто синтаксические изменения.

Чтобы использовать руль, мы устанавливаем его.

npm install --save express-handlebars

требуется Это в вашем файле и настройте свое приложение, чтобы использовать его так:

const express = require('express'),
      hbs = require('express-handlebars').create({defaultLayout:'main.hbs'}),
      app = express();

app.engine('hbs', hbs.engine);
app.set('view engine','hbs');

Итак, давайте сделаем базовый рендеринг с рулями:

  1. Создайте папку под названием экспресс-руль Создать Виды папка, а внутри Виды Папка создает другую папку под названием Макеты Отказ

2) Создать Server.js Файл и вставьте это внутри:

const express = require('express'),
      hbs = require('express-handlebars').create({defaultLayout:'main.hbs'}),
      app = express();

//setting our app engine to handlebars
app.engine('hbs', hbs.engine);
app.set('view engine', 'hbs');
app.get('/',(request,response)=>{
  response.render('home',{title: 'Home'});
});

app.get('/about',(request,response)=>{
  response.render('about',{title: 'About'});
});

app.listen(3000,()=>console.log('Express server started at port 3000'));

3) Внутри Макеты Папка, создать файл main.hbs Отказ Вставить это внутри:











{{title}}




{{{body}}}

4) Далее мы собираемся создать отдельные виды. Внутри Виды Папка, создайте два файла – Home.hbs и О.hbs Отказ Вставьте следующее внутри Home.hbs :

//home.hbs


Hello, I'm the Home page and you're welcome

И в нашем О.hbs :

//about.hbs


Hello, I'm the about page, what do you want to know about

Сделать Node Server.js В вашем терминале и ударил http://localhost: 3000 на вашем браузере.

Что происходит здесь?

Сначала мы требуем экспресс-руль и создать defaultlayout , назначение его main.hbs Отказ Это означает, что все наши взгляды будут представлять в main.hbs макет.

Посмотрите на Server.js Отказ Просто несколько вещей изменились вправо? Давайте начнем с этих двух линий:

app.engine('hbs', hbs.engine);
app.set('view engine','hbs');

Первая строка устанавливает приложение для HBS.Engine И вторая строка устанавливает свойство View Engine для руля. Довольно просто справа?

Маршруты в нашем Server.js также немного разные. Вот виновник:

response.render('home',{title: 'Home'});

В то время как .Отправить () Отправляет простой текст в браузер, Визуализация () ищет первый параметр в Виды папка и делает ее в браузере. В большинстве случаев мы могли бы захотеть пройти динамическое содержание. Мы даем представьте метод объекта в качестве второго параметра. Объект содержит ключи и значения данных, которые будут переданы внутри представления.

Возьми эту строку в нашем main.hbs Файл в нашей папке макета.

//main.hbs
{{title}}

{{title}} заменяется тем, что пропускается с видом. В нашем случае {Название: «Главная»} Отказ Мы можем пройти столько ценностей, сколько мы хотим к мнению. Просто добавьте его как свойство объекта.

Когда мы делаем Ответ .Render () Экспресс знает, где получить файлы, о которых мы просим. Давайте посмотрим на О.hbs Отказ


Hello, I'm the about page, what do you want to know about

Содержание этого файла заменяет переменную для тела в нашем Макет. Хандлбары :

{{{body}}}

Если вы спрашиваете, почему мы используем два брекета для {{title}} и три для {{{body}}}}}, вы на правой дороге.

Когда мы используем два брекета, мы выплющим все, даже теги HTML (без него). Вот что я имею в виду.

Если контент, который мы хотим отправить в браузер, это Здравствуйте, Wor ld , с двумя брекетами, Express будет R Удажи его как T; Hello World . Если мы используем три брекеты, Express поймет, что мы хотим Бол D текст и Делайте это как Hello World (смело).

Это в основном на том, как работают шаблонные двигатели в Express. Руль Обеспечивает одну страницу документацию. Я считаю это хорошим местом для начала.

Рендеринг статического контента в Express

Вы когда-нибудь думали о том, где мы будем хранить наши CSS, файлы JavaScript и изображения? Ну, Express предоставляет промежуточное программное обеспечение, чтобы сервер знал, где найти статический контент.

Вот как использовать это:

app.use(express.static(__dirname +'public'));

Положите это на вершину вашего Server.js Сразу после необходимости заявления. __dirname Удерживает путь, откуда проходит программа.

Если вы этого не получили, попробуйте это.

Удалить все на свой Server.js и положить это внутри:

Console.log (__ dirname);

Перейти к вашей командной строке и запустить Node Server.js Отказ Он показывает ваш путь к файловому узлу, которое работает.

Где мы храним наш статический контент, зависит от нас. Мы могли бы назвать это Активы или что-то, но вы должны убедиться, что вы добавляете его на дирнама вот так:

express.static(__dirname + 'static_folder_name').

Экспресс промежуточное ПО

Промежуточное программное обеспечение – это функции, которые инкапсулируют функциональность. Они выполняют операции по запросу HTTP и дают нам интерфейс высокого уровня для настройки их. Большинство промежуточных программ занимают три аргумента: Запрос , ответ Объекты и A Следующий функция. При обработке ошибок промежуточное ПО, есть дополнительный параметр: Err Объект, который может рассказать нам об ошибке и давайте перенесем ее на другие промежуточные программы.

Мы добавляем промежуточное программное обеспечение на наш сервер, используя app.use (name_of_middleware) . Также важно отметить, что промежуточное программное обеспечение используется в том же порядке их добавления. Я покажу вам пример позже, если вы не понимаете.

С этим определением мы также можем увидеть функции маршрута, такие как app.get () , app.post ( ) И так далее, как промежуточное программное обеспечение, за исключением того, что они применяются к определенным запросам HTTP VERB. Возможно, вы также можете узнать, что есть app.all () Маршрут, который применяется ко всем HTTP-запросам, не рассматривающим, если бы они были получить, пост или другой запрос.

//This middleware will be called for every request. GET or POST
app.all((request,response)=>{
  console.log('Hello world');
})

Обработчики маршрута принимают два параметра, путь к совпадению и промежуточное программное обеспечение для выполнения.

app.get('/',(request,,response)=>{
  response.send('Hello world');
});

Если путь оставлен, промежуточное ПО применяется к каждому запросу Get.

//Every GET request will call this middleware
app.get((request,response)=>{
  response.send('Hello world');
});

В нашем примере выше, как только мы отправим Получить Запрос, наш сервер отвечает на браузер, отправив «Hello World» сообщение, а затем заканчивается до другого запроса.

Но мы могли бы захотеть более одного промежуточного программного обеспечения. Есть способ сделать это. Помните наши Следующий функция? Мы могли бы использовать его, чтобы подтолкнуть контроль на другое промежуточное программное обеспечение.

Давайте посмотрим, как это работает. Скопируйте и вставьте этот код в наш server.js:

const express = require('express'),
      app = express();
      
//setting the port
app.set('port', process.env.PORT || 3000);

//first middleware
app.use((request,respone,next)=>{
  console.log(`processing for data for ${request.url}`);
  next();
});

//second middleware
app.use((request,response,next)=>{
  console.log(`The response.send will terminate the request`);
response.send(`Hello world`);
});

//third middleware
app.use((request,respone,next)=>{
  console.log(`I'll never get called`);
});

app.listen(3000,()=>console.log('Express server started at port 3000'));

От терминала, нажмите Node Server.js и посмотрите на терминал. Голова в свой браузер и откройте localhost: 3000 Отказ Посмотрите на вашу консоль снова, и вы увидите что-то подобное.

Express server started at port 3000
processing for data for /
The response.send will terminate the request

Наше первое промежуточное программное обеспечение выполняет каждый раз, когда запрос получен. Он пишет что-то в консоли и называет Далее () функция. Призывая Далее () Функция говорит, чтобы не расточить Запрос объект, но отправляет контроль на Следующий промежуточное ПО. В любое время мы пишем промежуточное программное обеспечение, не вызывая Следующий Функция, экспресс заканчивает Запрос объект.

Во втором промежуточной программе мы проходим Далее () Функция как аргумент, но мы никогда не называем это. Это прекращает Запрос объект и третье промежуточное программное обеспечение никогда не вызываются. Обратите внимание, что если мы никогда не отправим ничего для браузера во втором промежуточном освещении, клиент в конечном итоге будет в восторге.

Вот некоторые полезные промежуточные программы в Express.js:

  • Морган – Журнал каждый запрос
  • CORS – позволяет обменять запрос на пересеченное происхождение
  • Тело-парсер – промежуточное программное обеспечение для анализа request.body в экспресс-приложениях
  • Малтер – Node.js промежуточное ПО для обработки Мультипартные/формы-данные
  • сессия – Простой сеанс промежуточное ПО для Express.js
  • ErrorHandler – Обработчик ошибок только для разработки
  • Подавать-Фавикон – Favicon, обслуживающий промежуточное программное обеспечение
  • Csurf – Node.js CSRF Защита промежуточного программного обеспечения
  • Паспорт – Простая, ненавязчивая аутентификация
  • Merror – restsful-Friendly Express промежуточное программное обеспечение для обработки ошибок HTTP и ответы ошибок
  • Expressa – выразить промежуточное программное обеспечение для легкости отдыха API

Обработка данных формы в Express

Основная функция веб-сайта – это связь. Express предоставляет нам инструменты для понимания того, какие клиенты запросы и как правильно реагировать.

Express в основном имеет два места для хранения данных клиента. request.QueryString (для получения запроса) и request.body (для почтовых запросов) Отказ На стороне клиента он идеально подходит для использования пост-метода для представления формы, потому что большинство браузеров помещают ограничения на длину QueryString и дополнительные данные потеряны. Если вы не знаете, что такое строка запроса, это часть после вашего URL, которая содержит данные и не соответствует правильному устройству в вашей системе пути маршрутизации. Если вы не совсем понимаете, что такое строка запроса, вот пример:

facebook.com/users?name=Victor&age=100&occupation=whatever

С точки зрения того, где начинается вопросительный знак, называется строкой запроса. Он передает данные на сервер, но выставляет его в URL.

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

Давайте посмотрим на демо. Мы возьмем некоторые данные с нашего клиента через Get и отправьте его обратно на них.

Создать папку, позвони ей Форма-данные И создайте два файла внутри: Server.js и form.html Отказ Вставьте это в Server.js файл и form.html Файлы соответственно:

//server.js file

const express = require('express'),
      app = express();

//setting the port 
app.set('port', process.env.PORT || 3000);

//
app.get('/',(request,response)=>{
  response.sendFile(__dirname +'/form.html');
});

app.get('/process',(request,response)=>{
  console.log(request.query);
  response.send(`${request.query.name} said ${request.query.message}`);
});

app.listen(3000,()=>{
  console.log('Express server started at port 3000');
});
//form.html




  
    
    Form page
    
  

  

Беги Node Server.js , направляется до localhost: 3000 Заполните форму и отправьте ее.

Вот что бы выглядел результатом.

В нашем Server.js Файл здесь, у нас есть два маршрута Получить маршруты. Один для localhost: 3000 и localhost: 3000/Процесс Отказ

app.get('/',(request,response)=>{
   response.sendFile(__dirname + '/form.html');
});

А также

app.get('/process',(request,response)=>{
  response.send(`${request.query.name} said ${request.query.message}`);
});

Голова на вашу консоль. Вы увидите объект. Это доказывает, что наши Request.Query это объект, который содержит все запросы и их значения.

{
  name: 'victor',
  message: 'Hello world'
}

Если вы взгляните на нашу форму в form.html Страница, вы заметите, что наша форма имеет действие и Метод атрибуты. Действие Атрибут указывает страницу или маршрут, которая должна обрабатывать данные формы («процесс» в этом случае). Когда форма отправляется, она отправляет запрос на получение процесс Маршрут с содержанием нашей формы как QueryString данные.

Наше Server.js Файл также обрабатывает запрос на путь процесса и отправляет данные, переданные из нашего form.html к браузеру и консоли.

Давайте посмотрим, как мы справимся с этим методом пост. Пришло время очистить наши Server.js файл. Скопируйте и вставьте этот код в Server.js :

//server.js

const express = require('express'),
      app = express(),
      
//You must require the body-parser middleware to access request.body in express
bodyParser = require('body-parser');

//configuring bodyparser
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

//setting our port
app.set('port', process.env.PORT || 3000);

//Get route for localhost:3000
app.get('/',(request,response)=>{
  response.sendFile(__dirname +'/form.html');
});

//POST route for form handling
app.post('/',(request,response)=>{
  console.log(request.body);  
  response.send(`${request.body.name} said ${request.body.message}`);
});

app.listen(3000,()=>{
  console.log('Express server started at port 3000');
});
//form.html file




  
  
  Form page
    
  

  

Если вы посмотрите внимательно, первая другая вещь, которую мы делаем, требуется и использовать Тело-парсер Отказ Body-Parser – это промежуточное программное обеспечение, которое делает почтовые данные доступными в нашем request.body Отказ Имейте в виду, что request.body не будет работать без промежуточного программного обеспечения тела.

Вы также можете заметить, что у нас есть Get, так и пост-рейсы. Получите промежуточное программное обеспечение показывает форму и промежуточное программное обеспечение поста. Из них обоим можно использовать один путь маршрута, потому что у них есть разные методы.

Мы не могли сделать это для нашего первого примера, потому что наш метод формы был получен. Очевидно, что вы не можете иметь два запроса Get для того же маршрута, и они оба отправляют данные в браузер. Вот почему наш первый пример обработал форму на /процесс дорожка.

Обработка форм Ajax

Обработка форм Ajax с Express довольно прост. Экспресс предоставляет нам request.xhr Свойство, чтобы сказать нам, если запрос отправляется через AJAX. Мы можем соединить это с request.accepts () Метод мы говорили ранее. Это помогает нам определить, какой формат браузер хочет данные в. Если клиент понравится JSON, ну, мы просто дадим это JSON.

Давайте изменим нашу form.html использовать AJAX и наш Server.js Принять AJAX и отправить JSON.




  
  
  Form page
    
  
  

  
//server.js

const express = require('express'),
      app = express(),
      bodyParser = require('body-parser');

//configuring the body-parser middleware
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

//setting our app port
app.set('port', process.env.PORT || 3000);

//Route for  get requests.
app.get('/',(request,response)=>{
  response.sendFile(__dirname +'/form.html');
});

//Route to handle POST form requests.
app.post('/',(request,response)=>{
//we check if the request is an AJAX one and if accepts JSON
  if(request.xhr || request.accepts('json, html')==='json'){
    response.send({message:'Just wanted to tell you. It worked'});
   } else {
    //Do something else by reloading the page.
   }
});

app.listen(3000,()=>{
  console.log('Express server started at port 3000');
});

Вот как это работает

Здесь не много изменений – мы просто добавили путь к ветеринару, если запрос был сделан с AJAX.

Так вот что мы делаем. Мы сделали запрос AJAX One с методом пост. Мы связали с jQuery CDN. В теге скрипта мы прикрепим обработчик событий для события «Отправить». Когда мы сделаем это, мы предотвратим поведение по умолчанию для перезагрузки страницы.

Затем мы используем jQuery $ .ajax. () Способ сделать запрос AJAX. Сервер отвечает объектом с сообщение Собственность, которое мы тогда добавляем к пустую девчонку.

Если вы не знакомы с AJAX, я однажды написал несколько статей на Ajax. Проверьте их: Нежное введение в ajax и Легче асинхронные запросы с jQuery.

Базы данных в приложениях Node.js

Mongodb и CouchDB – некоторые системы баз данных, которые подходят для приложений Node.js. Это не полностью исключает возможность использования других баз данных. Мы посмотрим на MongoDB, но вы можете выбрать любой, который вам нравится.

Документы заменяют строки в реляционную базу данных, такую как MySQL. В MongoDB и других базах данных на основе документов данные хранятся и извлекаются в формате объекта. Это означает, что мы можем иметь глубоко вложенные структуры.

Если вы рассматриваете объекты в JavaScript, нет способа проверить, что значение свойства объекта является определенным типом. Вот что я имею в виду:

const obj = {текст: 1234}

Там нет способа убедиться, что ценность текст это строка.

К счастью, есть мангуст. Mongoose позволяет вам определить схемы, которые сильно проверяют данные и гарантируют, что они соответствуют объектам или документам в MongoDB. Mongoose – это объектный документ Mapper (ODM).

Введение в мангуст Это хорошее место для начала изучения и работы с мангустом.

Сеансы и печенье в Экспрессе

Http нестандартный. Это означает любой запрос или ответ, отправленный браузером или сервером, соответственно поддерживает никакой информации (штата) о предыдущих или будущих запросах и ответах. Каждый единственный запрос имеет все, что нужно, чтобы вызвать новый ответ сервера.

Но для серверов должен быть способ помнить клиентов, поскольку они просматривают сайт, поэтому им не нужно вводить пароли на каждой странице.

Сеть была достаточно инновационной, чтобы использовать печенье и сеансы. Печенье в основном небольшие файлы, хранящиеся на машине клиента. Когда клиенты отправляют запросы, сервер использует его для их идентификации. Больше похоже на паспорт, сервер тогда знает, что это их и применяет все их предпочтения.

Таким образом, идея будет хранить файлы на машине клиента. Хотя это не плохая идея, мы хотим убедиться, что мы не злоупотребляем пользователем хранилище пользователей, сохраняя огромные объемы данных. На другой стороне вещей мы понимаем, что если мы хотим сделать вещи сложнее догадаться и безопаснее, мы делаем его дольше и сложнее. Как мы можем достичь этих двух одновременно?

Люди придумали сессиями. Таким образом, идея сеансов заключается в том, что вместо того, чтобы хранить всю информацию о файле cookie клиента, сервер хранит идентификатор в cookie (небольшую строку). Когда клиент отправляет запросы, сервер принимает эту уникальную строку и соответствует его данным пользователя на сервере. Таким образом, мы добираемся, чтобы сохранить любую сумму данных и помнить пользователей.

Чтобы использовать файлы cookie в Express, нам нужно требовать Cookie-Parser промежуточное ПО. Помните нашу промежуточное программное обеспечение?

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

Безопасность в экспресс-приложениях

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

HTTPS. : Это не новое слово! Как вы, возможно, догадались, разница между HTTP и HTTPS является S (безопасность). HTTPS зашифрует пакеты, путешествующие через Интернет, чтобы люди не делали злонамеренные вещи с ним.

Итак, как я могу получить HTTPS?

Холод, давайте сделаем это медленно. Чтобы получить HTTPS, вам необходимо подойти к власти сертификата (CA). HTTPS основан на сервере, имеющем сертификат открытого ключа, иногда называемый SSL. CAS Назначьте сертификаты к квалифицированным серверам. Вы также должны понимать, что CAS делают корневые сертификаты, которые устанавливаются при установке вашего браузера. Таким образом, браузеры могут легко общаться с серверами с сертификатами.

Хорошие новости : Кто-нибудь может сделать свои собственные сертификаты.

Плохие новости : Браузеры не могут распознать эти сертификаты, потому что они не были установлены в качестве корневых сертификатов.

Невозможно : Вы не можете настроить все браузеры в мире во время установки, чтобы распознать свой сертификат.

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

Браузер даст вам предупреждения, но вы знаете о проблеме, так что это не будет много проблем. Вот a пост Это идет вас через создание собственного сертификата.

Как настроить HTTPS на местном уровне без надоедания ошибок конфиденциальности браузера Настройка HTTPS локально может быть сложному бизнесу. Даже если вам удается бороться на самостоятельные сертификаты в … deliciousbrains.com

Хватит говорить. Давайте предположим, что у вас сейчас есть сертификат SSL. Вот как сделать это работать с вашим экспресс-приложением.

Включение HTTPS в вашем приложении узла

Нам нужно использовать https Модуль для HTTPS. После получения наших полномочий от власти сертификата мы включаем его в качестве аргумента для Createserver () метод.

//server.js

const express = require('express'),
	  https = require('https'),
	  http = require('http'),
	  fs = require('fs'),
	  app = express();

//credentials obtained from a Certificate Authority
var options = {
  key: fs.readFileSync('/path/to/key.pem'),
  cert: fs.readFileSync('/path/to/cert.pem')
};

//Binding the app on different ports so the app can be assessed bt HTTP and HTTPS
http.createServer(app).listen(80);
https.createServer(options, app).listen(443);

Обратите внимание, что мы требуем http . и https. Это потому, что мы хотим ответить на обоих. В нашей программе мы используем ФС модуль (файловая система).

В основном мы предоставляем путь к тому, где хранится наш ключ SSL и сертификат. Модуль или что-то. Соблюдайте, что мы используем Readfilesync Метод вместо readfile Отказ Если вы понимаете архитектуру Node.js, вы сделаете вывод, что мы хотим прочитать файл синхронно перед запуском любых других строк кода.

Запуск этого кода асинхронно может привести к ситуациям, когда аспекты нашего кода, требующие содержания файла, не получают их вовремя.

Последние две линии связывают HTTP и HTTPS к двум разным портам и берут разные аргументы. Почему мы это делаем?

В большинстве случаев мы хотим, чтобы наш сервер все еще слушал запросы с HTTP и, возможно, перенаправлять их в HTTPS.

Примечание : Порт по умолчанию для HTTPS составляет 443.

Чтобы сделать этот базовый перенаправление, мы устанавливаем и требуем модуля Express-Force-SSL В верхней части нашей программы вроде так:

npm install express-force-ssl

И настроить так:

const express_force_ssl = require('express-force-ssl');
app.use(express_force_ssl);

Теперь наш сервер может эффективно позаботиться об уже запросах HTTP и HTTPS.

Проверка запроса на сайт (CSRF)

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

Способ справиться с этим, чтобы убедиться, что запросы приходят только с вашего сайта. Это довольно легко. Мы назначаем идентификатор пользователям и прикрепите его к формам, поэтому, когда они отправляют, мы можем сопоставить идентификатор и запретить доступ, если он не совпадает.

К счастью, есть промежуточное программное обеспечение, которое обрабатывает это – Csurf промежуточное ПО. Вот как это использовать:

npm install csurf

Чтобы использовать его в нашей программе:

const express = require('express'),
	  body_parser = require('body-parser'),
	  hbs = require('express-handlebars').create({defaultLayout: 'main',extname:'hbs'});
	  session = require('express-session'),
	  csurf = require('csurf'),

	  app = express();

//setting the app port
app.set('port', process.env.PORT || 3000);

//configuring the app for handlebars
app.engine('hbs', hbs.engine);
app.set('view engine', 'hbs');


//setting up a session csrf
app.use(session({
	name: 'My session csrf',
	secret: 'My super session secret',
	  cookie: {
	  	maxAge: null,
	    httpOnly: true,
	    secure: true
	  }
	})
  );

app.use(csurf());

//configuring the body parser middleware
app.use(body_parser.urlencoded());

//Route to login
app.get('/login', (request,response)=>{
	console.log(request.csrfToken());
	response.render('login',{
		csrfToken : request.csrfToken(),
		title: 'Login'
	});
});

app.listen(3000,()=>console.log('Express app started at port 3000'));
Here's the generated csrf token ({{csrfToken}})

Беги Node Server.js , отправляйтесь в ваш браузер localhost: 3000 Заполните форму и отправьте. Также проверьте в вашей командной строке и посмотрите, как токен.

Что мы делаем, создается и проходит Csrftoken на наш вход в систему.

Примечание: Csurf Модуль требует Экспресс-сессия модуль для работы. Мы настраиваем нашу сессию CSRF и передаем его к представлению через Ответ .Render () метод.

Теперь наше представление может добавить его в форму или любой другой конфиденциальный запрос.

Итак, что происходит, когда браузер не получает токен CSRF из форм браузера? Это заставляет ошибку. Убедитесь, что у вас есть маршрут обращения с ошибками в приложении Express, или иначе ваше приложение может плохо себя вести.

Аутентификация

Один шаг для уменьшения проблем аутентификации – отпустить людей и войти в систему со сторонними приложениями (Facebook, Twitter, Google, + и т. Д.). У целого у людей есть эти учетные записи, и вы также можете получить доступ к некоторым из их данных, таких как электронные письма и имена пользователей. Модули, как Passport.js Предоставьте очень элегантный интерфейс для обработки таких аутентификаций.

Вот …| Официальный паспорт.js Документация Отказ Я думаю, что это хорошее место для начала.

Еще один шаг для уменьшения проблем аутентификации – всегда зашифровать все пароли и расшифровать их обратно при показе их пользователей.

Еще кое-что. Я вижу это на многих сайтах. Они устанавливают сумасшедшие критерии для пароля пользователей на сайте. Я понимаю, что они пытаются сделать пароли более безопасными, но думать об этом. Чья это работа? Разработчик или пользователь?

Пользователь должен быть наименее обеспокоен вопросами безопасности. Когда критерии, подобные этим, установлены на пароли, пользователи не имеют другого варианта, чем использовать пароли, которые они никогда не помнят. Я знаю, что сеть становится лучше И мы выясним способ сделать аутентификацию лучше.

До этого я думаю, что мы можем заканчивать это здесь.

Это много информации. Но вам нужно больше, чем это, чтобы построить масштабируемые веб-приложения. Вот несколько проницательных книг для обучения больше о Express.

Если это было полезно, вы должны следовать за мной на Twitter Для более полезных вещей.

  1. Экспресс в действии по Evan Hahn Отказ
  2. Получение средств с Express, Mongo, угловым и узлом по Саймон Холмс Отказ

Оригинал: “https://www.freecodecamp.org/news/getting-off-the-ground-with-expressjs-89ada7ef4e59/”