Я экспериментирую с Node.js в AWS Lambda. И я столкнулся с проблемой с кодом ниже. Значение результата и значение ошибки всегда возвращаются пустыми. Я почти уверен, что это просто проблема масштаба, которую я устал видеть. Как мне получить возвращаемое значение и передать его обратно в ответ? Я уверен, что программы подключаются к Redis, потому что я получаю сообщение об ошибке, если я меняю порт или URL-адрес, а не когда они установлены правильно.
Код возврата:
{
"statusCode": 200,
"body": "{\"key\":\"q1\"}"
}
Код программы:
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)
};
};
Это связано с тем, что ваш вызов «redis.get» не разрешается при отправке «ответа».
Вам нужно дождаться ответа:
await new Promise((resolve) => {
redis.get(key, (err, result) => {
if (err) {
errorValue=err;
} else {
resultValue=result;
}
resolve();
});
})
или еще лучше превратить ответ Redis в ответ обещания:
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)
Проблема связана с обещаниями. Выполнение вашего обработчика завершается до того, как Redis вернет результат. Следующий фрагмент должен работать:
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)
};
};