You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hapi v17中从回调迁移至async/await:MongoDB查询适配问题

适配Hapi v17与Monk的异步查询方案

没问题,我帮你搞定这个Hapi版本升级后的适配问题!

Hapi v17最大的变化之一就是强制要求异步处理必须通过Promise或async/await来显式返回结果,不再支持旧版中回调里调用reply的方式——因为回调会在响应已经发送给客户端之后才执行,自然就失效了。好在Monk本身是支持Promise的,我们只需要把原来的回调写法改成异步风格就行。

方案一:使用async/await(推荐,代码更清晰)

把路由的handler声明为async函数,然后用await等待Monk的查询结果,最后通过Hapi的h工具包返回响应:

server.route({
  method: 'GET',
  path: '/your-path',
  handler: async (request, h) => {
    try {
      // 去掉回调,直接await Monk的find方法(它会返回Promise)
      const videos = await videodb.find({}, { sort: { 'created_on': -1 } });
      console.log(videos);
      // 直接返回内容,或者用h.response包装都可以
      return h.response("ok");
    } catch (err) {
      // 别忘了捕获查询过程中可能出现的错误
      console.error('查询出错:', err);
      return h.response("查询失败").code(500);
    }
  }
});

方案二:使用Promise的.then()链式调用

如果你暂时不想用async/await,也可以直接利用Monk返回的Promise做链式处理:

server.route({
  method: 'GET',
  path: '/your-path',
  handler: (request, h) => {
    return videodb.find({}, { sort: { 'created_on': -1 } })
      .then(videos => {
        console.log(videos);
        return "ok";
      })
      .catch(err => {
        console.error('查询出错:', err);
        return h.response("查询失败").code(500);
      });
  }
});

关键注意点

  • Hapi v17的handler参数从(request, reply)变成了(request, h),h是响应工具包,用来构建和返回响应;
  • 必须确保handler返回一个Promise(async函数自动返回Promise,或者直接返回Promise对象),Hapi会等待这个Promise完成后再发送响应;
  • 一定要处理错误,否则未捕获的异步错误会导致服务器崩溃。

内容的提问来源于stack exchange,提问作者daliz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:29:20