
Содержание статьи
Слободан Стоянович
Если вы разработчик Node.js или вы создали API с помощью Node.js, есть большой шанс, что вы использовали Express.js. Экспресс есть где факто самый популярный фреймворк 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 || 3000app.listen(port, () => console.log(`Server is listening on port ${port}.`))
Если вы сохраните этот фрагмент кода как app.js в новой папке, вы всего в трех шагах от простой программы Express:
- Создайте новый проект Node.js. Для этого запустите
npm init -y
в вашем терминале. Просто убедитесь, что вы перешли в папку, содержащуюapp.js
сначала. - Установите модуль Express с NPM, запустив
npm install express --save
команда из терминала. - Запустите
node app.js
и вы должны увидеть «Сервер прослушивающий порт 3000». как ответ.
Вуаль! У вас есть приложение Express. Перейдите в свой браузер, и вы увидите Hello world! сообщения.
Развертывание программы
Теперь наступает сложное: как вы можете показать это своим друзьям или семье? Как сделать его доступным для всех?
Развертывание может быть длительным и болезненным процессом, но представим, что вам удается сделать это быстро и успешно. Ваше приложение доступно для всех, и он жил долго и счастливо.
Пока однажды им не начала пользоваться неожиданная пользовательская армия.
У сервера были проблемы, но он работал.

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

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

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

Но вы отчаялись, вы бы попробовали все, включая черную магию и даже без сервера. «Что это за бессерверная вещица?»
Вы получили много ссылок, включая ссылку на бесплатный первый раздел «Бессерверные программы с Node.js» от Manning Publications.
В этом разделе объясняется бессерверное использование стиральных машин! Звучит безумно, но это имеет смысл. ? уже стал фанатом, потому вы решили попробовать.
Сделать вашу программу Express.js бессерверной
Эта глава была посвящена бессерверному режиму AWS. И теперь вы знаете, что бессерверный API состоит из функций API Gateway и 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 || 3000app.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": " }}
И если вы перейдете по ссылке из этого ответа в своем браузере, он напечатает Hello world! Это сработало! ?

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

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

Чтобы узнать больше о преимуществах вашего бизнеса благодаря бессерверному режиму, просмотрите статью.
Ограничение бессерверных программ Express.js
Программы 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:
Бессерверные программы с Node.js
Убедительное вступление в бессерверное развертывание с помощью Claudia.js.www.manning.com
Эта книга научит вас больше о бессерверных программах Express, но вы также узнаете, как создать и наладить реальный бессерверный API (с БД и аутентификацией) с помощью Node и Claudia.js. И как создавать чат-боты для Facebook Messenger и SMS (с помощью Twilio), а также навыки Alexa.