将 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
...