Estoy experimentando con Node.js en AWS Lambda. Y me he encontrado con un problema con el siguiente código. El valor del resultado y el valor del error siempre se devuelven en blanco. Estoy bastante seguro de que esto es solo un problema de alcance que estoy demasiado cansado de ver. ¿Cómo capturo el valor devuelto y lo devuelvo en la respuesta? Estoy seguro de que los programas se están conectando a redis porque recibo un mensaje de error si cambio el puerto o la URL y no lo hago cuando están configurados correctamente.
El código de retorno:
{ "statusCode": 200, "body": "{\"key\":\"q1\"}" }El código del programa:
const Redis = require("ioredis"); const redis = new Redis(6379, 'fredflenstone.lhpxwy.az.0002.use2.cache.amazonaws.com'); exports.handler = async(event)=>{ let key=event.key; let response; let resultValue; let errorValue; redis.get(key, (err, result) => { if (err) { errorValue=err; } else { resultValue=result; } }); response={ key: key, resultValue: resultValue, errorValue: errorValue }; return { statusCode: 200, body: JSON.stringify(response) }; };El problema se debe a las promesas. La ejecución de su controlador se completa antes de que redis devuelva el resultado. El siguiente fragmento debería funcionar:
const Redis = require("ioredis"); const redis = new Redis(6379, 'fredflenstone.lhpxwy.az.0002.use2.cache.amazonaws.com'); exports.handler = async(event)=>{ let key=event.key; let response; let resultValue; let errorValue; try{ resultValue = await redis.get(key); }catch(error) { errorValue = error; } response={ key: key, resultValue: resultValue, errorValue: errorValue }; return { statusCode: 200, body: JSON.stringify(response) }; };Es porque su llamada a "redis.get" no se resuelve cuando se envía "respuesta".
Tienes que esperar la respuesta:
await new Promise((resolve) => { redis.get(key, (err, result) => { if (err) { errorValue=err; } else { resultValue=result; } resolve(); }); })o incluso mejor, convierta la respuesta de redis en una respuesta de promesa:
await new Promise((resolve, reject) => { redis.get(key, (err, result) => { if (err) { reject(err); } else { resolve(result); } }) }) .then((result) => resultValue = result) .catch((err) => errorValue = err)