Если вы разработчик Node.js или создали API с помощью Node.js, велика вероятность, что вы использовали Express.js. Express - это де-факто самый популярный фреймворк для Node.js.

Экспресс-приложения легко создавать. Для простого приложения вам просто нужно добавить несколько маршрутов и обработчиков маршрутов. Вот и все.

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

'use strict'
const express = require('express')
const app = express()
app.get('/', (req, res) => res.send('Hello world!'))
const port = process.env.PORT || 3000
app.listen(port, () => 
  console.log(`Server is listening on port ${port}.`)
)

Если вы сохраните этот фрагмент кода как app.js в новой папке, вы всего в трех шагах от простого приложения Express:

  1. Создайте новый проект Node.js. Для этого запустите команду npm init -y в своем терминале. Просто убедитесь, что вы сначала перешли в папку, содержащую app.js.
  2. Установите модуль Express из NPM, выполнив команду npm install express --save из терминала.
  3. Запустите команду node app.js, и вы должны увидеть «Сервер прослушивает порт 3000». как ответ.

Вуаля! У вас есть приложение Express. Перейдите по адресу http: // localhost: 3000 в браузере, и вы увидите сообщение «Hello world!» сообщение.

Развертывание приложения

Теперь самое сложное: как вы можете показать это своим друзьям или семье? Как сделать его доступным для всех?

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

Пока однажды его не начала использовать неожиданная армия пользователей.

Ваш сервер боролся, но он работал.

По крайней мере, на какое-то время. А потом он умер. ☠️

Армия пользователей недовольна (по крайней мере, они не заплатили за приложение - или заплатили?). Вы в отчаянии и пытаетесь найти решение в Google. Может ли облако помочь?

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

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

Вы получили множество ссылок, в том числе ссылку на первую бесплатную главу Бессерверных приложений с Node.js от Manning Publications.

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

Делаем ваше приложение Express.js бессерверным

Эта глава была посвящена бессерверным сервисам AWS. И теперь вы знаете, что бессерверный API состоит из API-шлюза и функций AWS Lambda. Но как можно обойтись без сервера с приложением Express?

Это звучит так же многообещающе, как и фильм о том, как Мэтт Дэймон сокращается ...

Клаудия может помочь вам развернуть ваше приложение на AWS Lambda - давайте попросим ее о помощи!

Перед запуском команд Claudia убедитесь, что вы настроили свои учетные данные для доступа к AWS, как описано в этом руководстве.

Ваш код должен быть немного изменен для поддержки AWS Lambda и развертывания через Claudia. Вам нужно экспортировать ваш app вместо того, чтобы запускать сервер с помощью app.listen. Ваш app.js должен выглядеть следующим образом:

'use strict'
const express = require('express')
const app = express()
app.get('/', (req, res) => res.send('Hello world!'))
module.exports = app

Это сломает локальный сервер Express, но вы можете добавить app.local.js файл со следующим содержимым:

'use strict'
const app = require('./app')
const port = process.env.PORT || 3000
app.listen(port, () => 
  console.log(`Server is listening on port ${port}.`)
)

Затем запустите локальный сервер, используя следующую команду:

node app.local.js

Чтобы ваше приложение правильно работало с AWS Lambda, вам необходимо сгенерировать оболочку AWS Lambda для приложения Express. С Claudia вы можете сделать это, выполнив следующую команду в своем терминале:

claudia generate-serverless-express-proxy --express-module app

где app - это имя файла входа вашего приложения Express, только без расширения .js.

На этом шаге был создан файл с именем lambda.js со следующим содержимым:

'use strict'
const awsServerlessExpress = require('aws-serverless-express')
const app = require('./app')
const binaryMimeTypes = [
  'application/octet-stream',
  'font/eot',
  'font/opentype',
  'font/otf',
  'image/jpeg',
  'image/png',
  'image/svg+xml'
]
const server = awsServerlessExpress
  .createServer(app, null, binaryMimeTypes)
exports.handler = (event, context) =>
  awsServerlessExpress.proxy(server, event, context
)

Вот и все! Теперь вам нужно только развернуть приложение Express (с файлом lambda.js) в AWS Lambda и API Gateway с помощью команды claudia create.

claudia create --handler lambda.handler --deploy-proxy-api --region eu-central-1

Через несколько секунд команда завершилась и напечатала следующий ответ:

{
  "lambda": {
    "role": "awesome-serverless-expressjs-app-executor",
    "name": "awesome-serverless-expressjs-app",
    "region": "eu-central-1"
  },
  "api": {
    "id": "iltfb5bke3",
    "url": "https://iltfb5bke3.execute-api.eu-central-1.amazonaws.com/latest"
  }
}

И если вы перейдете по ссылке из этого ответа в своем браузере, он напечатает «Hello world!» Это сработало! 🙀

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

Это возможно, поскольку по умолчанию AWS Lambda автоматически масштабирует до 1000 одновременных выполнений. Новые функции готовы через несколько секунд после того, как API Gateway получит запрос.

Но это не единственное ваше преимущество. Вы также сэкономили деньги, помимо стабильного приложения при более высокой нагрузке. Используя AWS Lambda, вы платите только за использованные запросы. Кроме того, первый миллион запросов каждый месяц является бесплатным в рамках уровня бесплатного пользования.

Чтобы узнать больше о преимуществах использования бессерверного сервера для вашего бизнеса, прочтите эту статью.

Ограничения бессерверных приложений Express.js

Приложения Serverless Express звучат потрясающе, но у них есть некоторые ограничения.

Некоторые из важных ограничений бессерверных приложений Express:

  • Веб-сокеты не работают с AWS Lambda. Это потому, что вашего сервера не существует, когда нет запросов. Некоторая ограниченная поддержка веб-сокетов доступна через Веб-сокеты AWS IOT по протоколу MQTT.
  • Загрузка в файловую систему также не будет работать, если вы не загружаете файлы в папку /tmp. Это потому, что функция AWS Lambda доступна только для чтения. Даже если вы загрузите файлы в папку /tmp, они будут существовать недолго, пока функция еще «теплая». Чтобы убедиться, что ваша функция загрузки работает нормально, вы должны загружать файлы в AWS S3.
  • Ограничения выполнения также могут повлиять на ваше бессерверное приложение Express. Поскольку у API Gateway тайм-аут составляет 30 секунд, а максимальное время выполнения AWS Lambda составляет 5 минут.

Это только начало бессерверной истории любви между вашими приложениями и AWS Lambda. Ожидайте новых историй в ближайшее время!

Как всегда, большое спасибо моим друзьям Александру Симовичу и Миловану Йовичичу за помощь и отзыв о статье.

Все иллюстрации созданы с помощью приложения SimpleDiagrams4.

Если вы хотите узнать больше о бессерверных Express и бессерверных приложениях в целом, ознакомьтесь с книгой «Бессерверные приложения с Node.js», которую я написал вместе с Александром Симовичем для Manning Publications:



Книга расскажет вам больше о бессерверных приложениях Express, но вы также узнаете, как создавать и отлаживать реальный бессерверный API (с базой данных и аутентификацией) с помощью Node и Claudia.js. И как создавать чат-ботов для Facebook Messenger и SMS (с использованием Twilio) и навыки Alexa.