de Slobodan Stojanović
Express.js și AWS Lambda – o poveste de dragoste fără server
Dacă sunteți un dezvoltator Node.js sau ați creat un API cu Node.js, există mari șanse să le utilizați Express.js. Express este de facto cel mai popular cadru Node.js.
Aplicațiile Express sunt ușor de construit. Pentru o aplicație simplă, trebuie doar să adăugați câteva rute și manipulatoare de rute. Asta e.
De exemplu, cea mai simplă aplicație Express arată ca următorul fragment de cod:
'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}.`))
Dacă salvați acel fragment de cod ca app.js într-un folder nou, sunteți la doar trei pași distanță de a avea o aplicație simplă Express:
- Creați un nou proiect Node.js. Pentru a face acest lucru, rulați
npm init -y
comandă în terminalul dvs. Asigurați-vă că ați navigat la dosarul care conțineapp.js
primul. - Instalați modulul Express de la NPM executând
npm install express --save
comanda de la terminal. - Rulați
node app.js
și ar trebui să vedeți „Serverul ascultă pe portul 3000”. ca răspuns.
Voila! Aveți o aplicație Express. Accesați http: // localhost: 3000 în browserul dvs. și veți vedea un „Hello world!” mesaj.
Implementarea aplicației
Acum vine partea dificilă: cum o poți arăta prietenilor sau familiei? Cum să-l punem la dispoziția tuturor?
Implementarea poate fi un proces lung și dureros, dar să ne imaginăm că reușești să o faci rapid și cu succes. Aplicația dvs. este disponibilă pentru toată lumea și a trăit fericită pentru totdeauna.
Până într-o zi, o armată neașteptată de utilizatori a început să o folosească.
Serverul dvs. s-a luptat, dar a funcționat.
Cel puțin de ceva timp. Și apoi a murit. ☠️
O armată de utilizatori este supărată (cel puțin nu au plătit pentru aplicație – sau nu?) Sunteți disperat și încercați să soluționați Google. Norul poate ajuta?
Și ai întâlnit din nou unul dintre prietenii tăi enervanți. Vorbește din nou despre chestia asta fără server. Dar haide, aveți în continuare un server. Pur și simplu aparține altcuiva și nu aveți control asupra acestuia.
Dar ești disperat, ai încerca orice, inclusiv magie neagră și chiar fără server. „Ce naiba e chestia aia fără server, oricum?”
Ați ajuns cu mai multe link-uri, inclusiv cel către primul capitol gratuit din „Aplicații fără server cu Node.js” de Manning Publications.
Acest capitol explică fără server cu mașinile de spălat !? Sună nebunesc, dar cam are sens. ? a lovit deja ventilatorul, deci decideți să-l încercați.
Aplicația Express.js devine fără server
Capitolul a fost despre serverless pe AWS. Și acum știți că API fără server constă dintr-un gateway API și funcții AWS Lambda. Dar cum puteți rămâne fără server cu aplicația dvs. Express?
Sună la fel de promițător ca și filmul despre Matt Damon care se micșorează …
Claudia ar putea să vă ajute să implementați aplicația pe AWS Lambda – să îi cerem ajutorul!
Asigurați-vă că ați configurat acreditările de acces AWS așa cum este explicat în acest tutorial înainte de a rula comenzi Claudia.
Codul dvs. ar trebui să fie ușor modificat pentru a accepta AWS Lambda și implementarea prin Claudia. Trebuie să exportați fișierul app
în loc să porniți serverul folosind app.listen
. Ta app.js
ar trebui să arate ca următoarea listare a codului:
'use strict'
const express = require('express')const app = express()
app.get('/', (req, res) => res.send('Hello world!'))
module.exports = app
Asta ar rupe un server Express local, dar puteți adăuga app.local.js
fișier cu următorul conținut:
'use strict'
const app = require('./app')
const port = process.env.PORT || 3000app.listen(port, () => console.log(`Server is listening on port ${port}.`))
Și apoi rulați serverul local folosind următoarea comandă:
node app.local.js
Pentru ca aplicația dvs. să funcționeze corect cu AWS Lambda, trebuie să generați împachetarea AWS Lambda pentru aplicația dvs. Express. Cu Claudia, puteți face acest lucru executând următoarea comandă în terminal:
claudia generate-serverless-express-proxy --express-module app
Unde app
este un nume al unui fișier de intrare al aplicației dvs. Express, doar fără .js
extensie.
Acest pas a generat un fișier numit lambda.js
, cu următorul conținut:
'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)
Asta e! Acum trebuie doar să implementați aplicația Express (cu lambda.js
fișier) către AWS Lambda și API Gateway folosind claudia create
comanda.
claudia create --handler lambda.handler --deploy-proxy-api --region eu-central-1
După câteva momente, comanda a terminat și a imprimat următorul răspuns:
{ "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" }}
Și dacă vizitați linkul din răspunsul respectiv în browserul dvs., acesta imprimă „Hello world!” A mers! ?
Cu o aplicație fără server, armata dvs. de utilizatori poate continua să crească și aplicația dvs. va funcționa în continuare.
Este posibil, deoarece AWS Lambda va scala automat până la 1000 de execuții simultane în mod implicit. Funcțiile noi sunt gata la câteva momente după ce API Gateway primește cererea.
Dar acesta nu este singurul dvs. beneficiu. De asemenea, ați economisit bani pe lângă faptul că aveți o aplicație stabilă sub o încărcare mai mare. Cu AWS Lambda, plătiți numai pentru solicitările pe care le-ați utilizat. De asemenea, primele milioane de solicitări în fiecare lună sunt gratuite, ca parte a unui nivel gratuit.
Pentru a citi mai multe despre modul în care beneficiază afacerea dvs. prin serverless, consultați acest articol.
Limitări ale aplicațiilor Express.js fără server
Aplicațiile fără server Express sună minunat, dar au unele limitări.
Unele dintre limitările importante ale aplicațiilor Express fără server sunt următoarele:
- Websockets nu lucrați cu AWS Lambda. Acest lucru se datorează faptului că serverul dvs. nu există atunci când nu există cereri. Unele asistențe limitate pentru websockets sunt disponibile prin Websockets AWS IOT peste protocolul MQTT.
-
Încărcare nici în sistemul de fișiere nu va funcționa, cu excepția cazului în care încărcați pe
/tmp
pliant. Asta pentru că funcția AWS Lambda este doar în citire. Chiar dacă încărcați fișiere în/tmp
folder, vor exista pentru o perioadă scurtă de timp, în timp ce funcția este încă „caldă”. Pentru a vă asigura că funcția de încărcare funcționează bine, ar trebui să încărcați fișiere în AWS S3. - Limite de execuție poate afecta, de asemenea, aplicația Express fără server. Deoarece API Gateway are un timeout de 30 de secunde, iar timpul maxim de execuție al AWS Lambda este de 5 minute.
Acesta este doar începutul unei povești de dragoste fără server între aplicațiile dvs. și AWS Lambda. Așteptați mai multe povești în curând!
Ca întotdeauna, mulțumiri prietenilor mei Aleksandar Simović și Milovan Jovičić pentru ajutor și revenire la articol.
Toate ilustrațiile sunt create folosind Diagramele simple4 aplicație.
Dacă doriți să aflați mai multe despre aplicațiile fără server Express și aplicațiile fără server în general, consultați „Aplicații fără server cu Node.js”, cartea pe care am scris-o împreună cu Aleksandar Simovic pentru Manning Publications:
Aplicații fără server cu Node.js
O introducere convingătoare la implementările fără server folosind Claudia.js.www.manning.com
Cartea vă va învăța mai multe despre aplicațiile Express fără server, dar veți învăța și cum să construiți și să depanați un API fără server din lumea reală (cu DB și autentificare) folosind Node și Claudia.js. Și cum să construiești chatbots, pentru Facebook Messenger și SMS (folosind Twilio) și abilități Alexa.