将 2 个 redis hgetall 查询操作为一个响应
manipulate 2 redis hgetall queries into a single response
下面是我当前的工作代码,但现在我需要将来自 2 个单独的 redis 键的值聚合到 1 个响应中。
function resolveEnergyProBusDeviceInfo(req: any, res: any) {
const uuid = req.params.uuid
const key = "stream-api-uuid." + uuid + ".devInfo"
client.hgetall(key, function (err, data) {
if (err) {
throw err;
}
if (data !== null) {
const devInfo: devInfo = JSON.parse(JSON.stringify(data))
return res.status(200).json({
"uuid": JSON.parse(String(devInfo.uuid)),
"bus_index": parseInt(String(devInfo.bus_index)),
"sensors": JSON.parse(String(devInfo.sensor))
});
} else {
return res.status(204).send();
}
});
}
所以我正在尝试做类似下面的事情(抱歉我仍然处于同步心态):
function resolveEnergyProBusDeviceInfo2(req: any, res: any) {
const uuid = req.params.uuid
const key0 = "stream-api-uuid." + uuid + ".0.devInfo"
const key1 = "stream-api-uuid." + uuid + ".1.devInfo"
const bus0Info = queryDevInfoForIndex(key0);
const bus1Info = queryDevInfoForIndex(key1);
return res.status(200).json({
"uuid": uuid,
"bus_info0": JSON.parse(String(bus0Info)),
"bus_info1": JSON.parse(String(bus1Info))
});
}
function queryDevInfoForIndex(key: string) {
client.hgetall(key, function (err, data) {
if (err) {
throw err;
}
if (data !== null) {
const busInfo: devInfo = JSON.parse(JSON.stringify(data))
return busInfo;
} else
const busInfo: devInfo = JSON.parse(JSON.stringify(data))
return busInfo;
})
}
因为 hgetall returns 是一个布尔值,而且它的数据似乎只能在其回调中进行操作,所以我在构建更高级别的响应时遇到了麻烦。
正在研究承诺,但还没有走得太远...
这是我的解决方案的核心,经过一些实验,使用:
- 承诺 redis hgetall 调用
- async/await 存储值
const client = redis.createClient({
host: config.get('redis.host') as string,
port: config.get('redis.port') as number
});
const pClient = bluebird.promisifyAll(client);
async function getBusInfo(key: String) {
return pClient.hgetallAsync(key)
.then((data: any) => {
if (!_.isEmpty(data)) {
const parsedData = JSON.parse(JSON.stringify(data))
let parsedBusInfo = {} as BusInfo;
parsedBusInfo.bus_index = parseInt(String(parsedData.bus_index));
parsedBusInfo.sensor = JSON.parse(String(parsedData.sensor));
return parsedBusInfo
} else {
return {
"anEmptyList": []
}
}
})
.catch((err: any) => {
console.log(err);
})
}
const bus0Info = await getBusInfo("myKey")
...
//parse and send back response
...
下面是我当前的工作代码,但现在我需要将来自 2 个单独的 redis 键的值聚合到 1 个响应中。
function resolveEnergyProBusDeviceInfo(req: any, res: any) {
const uuid = req.params.uuid
const key = "stream-api-uuid." + uuid + ".devInfo"
client.hgetall(key, function (err, data) {
if (err) {
throw err;
}
if (data !== null) {
const devInfo: devInfo = JSON.parse(JSON.stringify(data))
return res.status(200).json({
"uuid": JSON.parse(String(devInfo.uuid)),
"bus_index": parseInt(String(devInfo.bus_index)),
"sensors": JSON.parse(String(devInfo.sensor))
});
} else {
return res.status(204).send();
}
});
}
所以我正在尝试做类似下面的事情(抱歉我仍然处于同步心态):
function resolveEnergyProBusDeviceInfo2(req: any, res: any) {
const uuid = req.params.uuid
const key0 = "stream-api-uuid." + uuid + ".0.devInfo"
const key1 = "stream-api-uuid." + uuid + ".1.devInfo"
const bus0Info = queryDevInfoForIndex(key0);
const bus1Info = queryDevInfoForIndex(key1);
return res.status(200).json({
"uuid": uuid,
"bus_info0": JSON.parse(String(bus0Info)),
"bus_info1": JSON.parse(String(bus1Info))
});
}
function queryDevInfoForIndex(key: string) {
client.hgetall(key, function (err, data) {
if (err) {
throw err;
}
if (data !== null) {
const busInfo: devInfo = JSON.parse(JSON.stringify(data))
return busInfo;
} else
const busInfo: devInfo = JSON.parse(JSON.stringify(data))
return busInfo;
})
}
因为 hgetall returns 是一个布尔值,而且它的数据似乎只能在其回调中进行操作,所以我在构建更高级别的响应时遇到了麻烦。 正在研究承诺,但还没有走得太远...
这是我的解决方案的核心,经过一些实验,使用:
- 承诺 redis hgetall 调用
- async/await 存储值
const client = redis.createClient({
host: config.get('redis.host') as string,
port: config.get('redis.port') as number
});
const pClient = bluebird.promisifyAll(client);
async function getBusInfo(key: String) {
return pClient.hgetallAsync(key)
.then((data: any) => {
if (!_.isEmpty(data)) {
const parsedData = JSON.parse(JSON.stringify(data))
let parsedBusInfo = {} as BusInfo;
parsedBusInfo.bus_index = parseInt(String(parsedData.bus_index));
parsedBusInfo.sensor = JSON.parse(String(parsedData.sensor));
return parsedBusInfo
} else {
return {
"anEmptyList": []
}
}
})
.catch((err: any) => {
console.log(err);
})
}
const bus0Info = await getBusInfo("myKey")
...
//parse and send back response
...