Investigamos en distintos espacios para brindarte la respuesta a tu problema, en caso de dudas puedes dejarnos la pregunta y te contestaremos sin falta.
Solución:
Según la documentación de Lambda invocar (), verá que, de forma predeterminada, la función Lambda se invoca utilizando el RequestResponse
tipo de invocación. Para invocar la función de forma asíncrona, debe especificar el Event
tipo de invocación, así:
lambda.invoke(
FunctionName: 'testLambda',
InvocationType: 'Event',
Payload: JSON.stringify(event, null, 2)
,function(err,data));
Estaba trabajando con la última versión actual de node.js 8.10 en AWS Lambda.
La segunda lambda no se ejecutó (y nunca se llamó a la función de devolución de llamada) hasta que usé el asíncrono/espera mecanismo.
Por lo tanto, la función del controlador debe ser asíncrona y la llamada ‘lambda.invoke’ debe estar envuelta con una Promesa.
aquí está mi código de trabajo:
function invokeLambda2(payload)
const params =
FunctionName: 'TestLambda2',
InvocationType: 'Event',
Payload: JSON.stringify(payload)
;
return new Promise((resolve, reject) =>
lambda.invoke(params, (err,data) =>
if (err)
console.log(err, err.stack);
reject(err);
else
console.log(data);
resolve(data);
);
);
exports.handler = async (event, context) =>
const payload =
'message': 'hello from lambda1'
;
await invokeLambda2(payload);
context.done();
;
Tenga en cuenta que el controlador no espera para que salga la segunda lambda, solo para que se active y se llame a la función de devolución de llamada.
También podrías devolver el Promesa desde dentro del controlador, no tiene que usar esperar con una segunda función.
No es necesario realizar ninguna importación cuando se trabaja con Promises y async/await, aparte de:
const AWS = require('aws-sdk');
const lambda = new AWS.Lambda();
Con referencia a la respuesta de Ronginat, en lugar de envolver lambda.invoke()
en una Promesa, podrías usar directamente lambda.invoke().promise()
y haz algo como esto: (probado en Node.js 12.x)
exports.handler = async (event) =>
const payload = 'hello from lambda 1';
const params =
FunctionName: 'lambda2',
InvocationType: 'Event',
Payload: JSON.stringify(payload),
;
const LambdaPromise = (params) => lambda.invoke(params).promise();
const responseFromLambda2 = await LambdaPromise(params);
return responseFromLambda2; //this should return StatusCode: 202, Payload: ''
;
Al final de todo puedes encontrar las explicaciones de otros creadores, tú igualmente tienes la opción de mostrar el tuyo si te apetece.