node.js 变量不在代码块中
node.js variable not surviving code block
我正在 AWS Lambda 中试验 Node.js。而且,我 运行 遇到了以下代码的问题。结果值和错误值总是 returned 空白。我很确定这只是一个我不想看到的范围问题。如何捕获 return 值并将其传回响应?我确定程序正在连接到 redis,因为如果我更改端口或 URL 我会收到一条错误消息,而当它们设置正确时我不会收到错误消息。
return代码:
{
"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 响应转换为 promise 响应:
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)
};
};
我正在 AWS Lambda 中试验 Node.js。而且,我 运行 遇到了以下代码的问题。结果值和错误值总是 returned 空白。我很确定这只是一个我不想看到的范围问题。如何捕获 return 值并将其传回响应?我确定程序正在连接到 redis,因为如果我更改端口或 URL 我会收到一条错误消息,而当它们设置正确时我不会收到错误消息。
return代码:
{
"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 响应转换为 promise 响应:
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)
};
};