Fastify:如何等待Redis发布/订阅消息后再发送响应?

elcex8rz  于 2022-12-03  发布在  Redis
关注(0)|答案(2)|浏览(147)

我有一个路由需要等待Redis发布/订阅消息才能发送响应。

app.post('/route', async function (req: any, rep) {
    // Listen for redis
    redis.on('message', async (ch, msg) => {
      let match = JSON.parse(msg)
      if (match.id == req.body.id) {
        rep.send('ok')
      }
    })
    // How to "wait" here?
  })

由于ioredis.on()不返回Promise,所以我不能使用await来阻止,我该怎么做才能让代码“等待”Redis消息呢?

qacovj5a

qacovj5a1#

一个简单的 Package 器就可以了

app.post("/route", async function (req: any, rep) {
  const [ch, msg] = await waitForMessage(redis);
  let match = JSON.parse(msg);
  if (match.id == req.body.id) {
    rep.send("ok");
  }
});

function waitForMessage(redis) {
  return new Promise((resolve) =>
    redis.on("message", (...args) => resolve(args))
  );
}
svujldwt

svujldwt2#

对Konrad的回答进行了修改,以便您可以处理多个消息,直到某些条件匹配为止。

export async function onMessage(redis: ioredis, exec: (...args: any[]) => boolean) {
  return new Promise((resolve) => {
    redis.on('message', (...args) => { if (exec(args)) resolve(args) })
  })
}

相关问题