【问题标题】:How to return result from an event callback in a hapijs route handler (version 17+)如何从 hapijs 路由处理程序中的事件回调返回结果(版本 17+)
【发布时间】:2019-06-19 05:11:10
【问题描述】:

在下面的路由中,我想通过ioredis'scanStream方法获取从redis中删除的key的数量。如果我像下面这样编码,我总是会在响应中得到{ 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 }
  }
}

【问题讨论】:

  • 但是您可以轻松地将stream.on 分离到它自己的函数中并返回一个承诺......现在您可以await 获得stream.on
  • @balexandre 应该可以。但是我发现了另一种方法,请参阅我对自己问题的回答。

标签: node.js hapijs


【解决方案1】:

只是想通了,而不是

return { len }

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

那里可能有更清洁的解决方案,但这似乎暂时完成了工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-29
    • 2013-01-09
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多