Tengo una puerta de enlace api que necesito integrar con una lambda para mutar algunos datos de solicitud y luego pasarlos a otro servicio.
Tengo mi lambda configurada sincrónicamente (evento, contexto, devolución de llamada) y funciona bien para solicitudes sincrónicas. Sin embargo, cuando agrego una funcionalidad de "Proxy" a la lambda (realizo una solicitud a otro punto final, obtengo la respuesta y devuelvo dicha respuesta a la puerta de enlace api), parece que no puedo manejar la promesa correctamente.
Aquí hay un pseudocódigo de lo que tengo:
const { fetch } = require('node-fetch'); const proxyMethod = (event, callback) => { const request = // valid fetch request fetch(request) .then(result => callback(null, result)) .catch(error => callback(Error(error)); } exports.handler = (event, context, callback) => { proxyMethod(event, callback); }El problema es que no creo que esté manejando la promesa sincrónicamente, y usar async/await en "proxyMethod" básicamente no tiene efecto o la devolución de llamada no está esperando que se resuelva la promesa.
Esto es lo que obtengo en los registros de la puerta de enlace API:
Sending request to https://lambda.us-east-1.amazonaws.com/2015-03-31/functions/arn:aws:lambda:us-east-1:########:function:#########/invocations Received response. Status: 200, Integration latency: 749 ms Endpoint response headers: {Date=Tue, 21 Jul 2020 02:11:31 GMT, Content-Type=application/json, Content-Length=4, Connection=keep-alive, x-amzn-RequestId=######, x-amzn-Remapped-Content-Length=0, X-Amz-Executed-Version=$LATEST, X-Amzn-Trace-Id=root=########;sampled=0} Endpoint response body before transformations: null Execution failed due to configuration error: Malformed Lambda proxy response Gateway response type: DEFAULT_5XX with status code: 502Encontré información útil aquí. En un montón de lugares diferentes, resulta que el tiempo de ejecución del nodo es compatible con el flujo asíncrono, por lo que necesitaba usar await para esperar la solicitud de recuperación y luego esperar nuevamente en "response.json ()" para obtener la respuesta del servicio río abajo.