
Inspiré par le tailleur de bibliothèque AWSLABS AWS-Serverless-Express conçu pour le framework Web Fastify.
Aucune utilisation des prises internes, utilise la fonction Inject de Fastify.
Semble plus rapide (comme son nom l'indique) que AWS-Serverless-Express et AWS-Serverless-Fastify
$ npm i @fastify/aws-lambda @ Fastify / AWS-Lambda peut prendre des options en les passant avec: awsLambdaFastify(app, options)
| propriété | description | valeur par défaut |
|---|---|---|
| mimétypes binaires | Tableau de mimétypes binaires à gérer | [] |
| EnforceBase64 | Fonction qui reçoit la réponse et renvoie un booléen indiquant si le contenu de la réponse est binaire ou non et doit être codé de base64 | undefined |
| Serializelambdaarguments | Activez la sérialisation de l'événement et du contexte de Lambda dans Http Header x-apigateway-event x-apigateway-context | false (était true pour <v2.0.0) |
| décoraterequest | Décorer la demande de stabilisation avec l'événement lambda et request.awsLambda.event de contexte request.awsLambda.context | true |
| décorationpropertyName | Le nom de la propriété par défaut pour la décoration de demande | awsLambda |
| callbackwaitsForemptyEventloop | Voir: documentation officielle | undefined |
| conserver | Conserver la partie de la scène de l'URL de la passerelle API | false |
| PathParameterusedaspath | Utilisez un PathParameter défini comme chemin (c'est-à-dire 'proxy' ) | false |
| ParscommaseparatedQueryParams | Analyser les requêtes avec des virgules dans un tableau de valeurs. Affecte le comportement de l'analyseur de requête avec des virgules tout en utilisant le format de charge utile version 2.0 | true |
const awsLambdaFastify = require ( '@fastify/aws-lambda' )
const app = require ( './app' )
const proxy = awsLambdaFastify ( app )
// or
// const proxy = awsLambdaFastify(app, { binaryMimeTypes: ['application/octet-stream'], serializeLambdaArguments: false /* default is true */ })
exports . handler = proxy
// or
// exports.handler = (event, context, callback) => proxy(event, context, callback)
// or
// exports.handler = (event, context) => proxy(event, context)
// or
// exports.handler = async (event, context) => proxy(event, context) const fastify = require ( 'fastify' )
const app = fastify ( )
app . get ( '/' , ( request , reply ) => reply . send ( { hello : 'world' } ) )
if ( require . main === module ) {
// called directly i.e. "node app"
app . listen ( { port : 3000 } , ( err ) => {
if ( err ) console . error ( err )
console . log ( 'server listening on 3000' )
} )
} else {
// required as a module => executed on aws lambda
module . exports = app
} Lorsqu'il est exécuté dans votre fonction lambda, nous n'avons pas besoin d'écouter un port spécifique, nous exportons donc l' app dans ce cas. Le fichier lambda.js utilisera cette exportation.
Lorsque vous exécutez votre application Fastify comme toujours, c'est-à-dire node app.js (la détection pour cela peut être require.main === module ) , vous pouvez normalement écouter votre port, vous pouvez donc toujours exécuter votre fonction Fastify localement.
L'événement et le contexte Lambda d'origine sont passés via la demande de Fitftify et peuvent être utilisés comme ceci:
app . get ( '/' , ( request , reply ) => {
const event = request . awsLambda . event
const context = request . awsLambda . context
// ...
} ) Si vous ne l'aimez pas, vous pouvez désactiver cela en définissant l'option decorateRequest sur false .
Alternativement, l'événement et le contexte Lambda d'origine sont passés via des en-têtes et peuvent être utilisés comme ceci, si la définition de l'option serializeLambdaArguments sur true :
app . get ( '/' , ( request , reply ) => {
const event = JSON . parse ( decodeURIComponent ( request . headers [ 'x-apigateway-event' ] ) )
const context = JSON . parse ( decodeURIComponent ( request . headers [ 'x-apigateway-context' ] ) )
// ...
} ) Étant donné que AWS Lambda permet désormais l'utilisation de modules ECMAScript (ES) dans Node.js 14 Runtime, vous pouvez abaisser la latence de démarrage à froid lorsqu'elle est utilisée avec une concurrence provisoire grâce à la fonction d'attente de niveau supérieur.
Nous pouvons l'utiliser en appelant la fonction fastify.ready() en dehors de la fonction de gestionnaire lambda, comme ceci:
import awsLambdaFastify from '@fastify/aws-lambda'
import app from './app.js'
export const handler = awsLambdaFastify ( app )
await app . ready ( ) // needs to be placed after awsLambdaFastify call because of the decoration: https://github.com/fastify/aws-lambda-fastify/blob/master/index.js#L9Ici, vous pouvez trouver le problème approprié discutant de cette fonctionnalité.
@ FASTIFY / AWS-LAMBDA (DecorateRequest: False) x 56 892 OPS / Sec ± 3,73% (79 courses échantillonnées)
@ Fastify / AWS-Lambda x 56 571 OPS / SEC ± 3,52% (82 courses échantillonnées)
@ FASTIFY / AWS-LAMBDA (Serializelambdaarguments: True) x 56 499 OPS / SEC ± 3,56% (76 courses échantillonnées)
Serverless-HTTP x 45 867 OPS / SEC ± 4,42% (83 exécutions échantillonnées)
AWS-Serverless-Fastify x 17 937 OPS / Sec ± 1,83% (86 courses échantillonnées)
AWS-Serverless-Express X 16 647 OPS / Sec ± 2,88% (87 exécutions échantillonnées)
Le plus rapide est @ Fastify / AWS-Lambda (DecorateRquest: False), @ Fastify / AWS-Lambda
Les logos affichés dans cette page sont des propriétés des organisations respectives et elles ne sont pas distribuées sous la même licence que @ Fastify / AWS-Lambda (MIT).