如何从hapijs路由处理程序(版本17+)中的事件回调中返回结果

时间:2019-06-18 20:49:17

标签: node.js hapijs

在以下路由中,我想使用ioredis'scanStream方法获取从redis删除的密钥数。如果我像下面这样编码,我总是会在响应中得到{ len: null },因为return语句不会等待stream.on完成。我正在拔头发,但找不到解决方法。咨询吗?


{
  route: '/some/path/{somekey}',
  handler: (request, h) => {
    // redis is an ioredis instance
    const { redis, params } = request
    const stream = redis.scanStream({
      match: `someprefix:${params.somekey}-*`
    })
    let len = null
    stream.on('data', async keys => {
      len = keys.length
      console.log(`removing ${keys}`)
      if (len > 0) {
        const pipeline = client.pipeline()
        keys.forEach(key => pipeline.del(key))
        await pipeline.exec()
      }
    })
    return { len }
  }
}

1 个答案:

答案 0 :(得分:0)

只需弄清楚,而不是

return { len }

return new Promise(resolve => stream.on('end', () => resolve({ len })))

可能会有更清洁的解决方案,但这似乎可以立即完成工作。