
Inspirado en el sastre de la Biblioteca AWSLABS AWS-Serverless-Express hecho para el marco web de Fastify.
No se usa los enchufes internos, utiliza la función inyección de Fastify.
Parece más rápido (como su nombre lo indica) que AWS-Serverless-Express y AWS-Serverless-Fastify
$ npm i @fastify/aws-lambda @Fastify/AWS-Lambda puede tomar opciones pasándolas con: awsLambdaFastify(app, options)
| propiedad | descripción | valor predeterminado |
|---|---|---|
| binarios | Variedad de mimetipos binarios para manejar | [] |
| Forcebase64 | Función que recibe la respuesta y devuelve un booleano que indica si el contenido de respuesta es binario o no y debe estar codificado por la base64 | undefined |
| Serializelambdaargumentos | Active la serialización del evento y el contexto Lambda en el encabezado HTTP x-apigateway-event x-apigateway-context | false (era true para <v2.0.0) |
| decorateRequest | Decora la solicitud de Fastify con el evento Lambda y request.awsLambda.context request.awsLambda.event de contexto. | true |
| decoraciónpropertyname | El nombre de la propiedad predeterminado para la decoración de la solicitud | awsLambda |
| devoción de llamada aficionlloop | Ver: Documentación oficial | undefined |
| retener escenario | Retener la parte del escenario de la URL de la puerta de enlace API | false |
| Pathparameterusedaspath | Use un Pathparameter definido como ruta (es decir, 'proxy' ) | false |
| parsecommaseparatedQueryParams | Analizar el consulta con comas en una matriz de valores. Afecta el comportamiento del analizador de consulta con comas mientras se usa el formato de carga útil versión 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
} Cuando se ejecutamos en su función Lambda, no necesitamos escuchar un puerto específico, por lo que solo exportamos la app en este caso. El archivo lambda.js utilizará esta exportación.
Cuando ejecuta su aplicación Fastify como siempre, es decir, node app.js (la detección de esto podría ser require.main === module ) , normalmente puede escuchar su puerto, por lo que aún puede ejecutar su función de Fastify localmente.
El evento y el contexto LAMBDA originales se pasan a través de la solicitud de Fastify y se pueden usar así:
app . get ( '/' , ( request , reply ) => {
const event = request . awsLambda . event
const context = request . awsLambda . context
// ...
} ) Si no le gusta, puede deshabilitar esto estableciendo la opción decorateRequest en false .
Alternativamente, el evento y el contexto Lambda originales se pasan a través de encabezados y se pueden usar de esta manera, si establece la opción serializeLambdaArguments en 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' ] ) )
// ...
} ) Dado que AWS Lambda ahora permite el uso de módulos ECMAScript (ES) en Node.js 14 tiempos de ejecución, puede reducir la latencia de inicio en frío cuando se usa con concurrencia aprovisionada gracias a la funcionalidad de espera de nivel superior.
Podemos usar esto llamando a la función fastify.ready() fuera de la función del controlador Lambda, como esta:
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#L9Aquí puede encontrar el problema de aprendizaje discutiendo esta característica.
@Fastify/AWS-Lambda (DecorAtequest: False) x 56,892 OPS/SEC ± 3.73% (79 corridas muestreadas)
@Fastify/AWS-Lambda X 56,571 OPS/SEC ± 3.52% (82 ejecuciones muestreadas)
@Fastify/AWS-Lambda (Serializelambdaargumentos: verdadero) x 56,499 OPS/seg ± 3.56% (76 corridas muestreadas)
Serverless-HTTP X 45,867 OPS/SEC ± 4.42% (83 ejecuciones muestreadas)
AWS-Serverless-Fastify X 17,937 OPS/SEC ± 1.83% (86 ejecuciones muestreadas)
AWS-Serverless-Express x 16,647 OPS/seg ± 2.88% (87 corridas muestreadas)
El más rápido es @fastify/aws-lambda (decorateRequest: false), @fastify/aws-lambda
Los logotipos que se muestran en esta página son propiedad de las organizaciones respectivas y no se distribuyen bajo la misma licencia que @Fastify/AWS-Lambda (MIT).