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
相关产品推荐
相关产品推荐

