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

Hapi.js中onRequest钩子存入AsyncLocalStorage的数据在handler中为undefined如何解决

Hapi.js AsyncLocalStorage取值为空问题原因及修复方案

核心产生原因

  • AsyncLocalStorage.run() 的上下文有效范围仅覆盖传入回调函数的内部执行链路,你的代码在run回调内部直接同步resolve(h.continue),会导致run回调立刻执行结束,上下文被提前销毁。后续Hapi执行onRequest之后的生命周期(包括身份校验、路由匹配、handler执行)都不在你创建的存储上下文范围内,自然拿不到存储数据。
  • 潜在实例不一致问题:你导出的存储实例名为asyncLocalStorage,但钩子代码中通过getLocalStorage()获取实例,如果二者不是指向同一个实例,也会出现取值为空的情况。

错误操作说明

你没有将Hapi后续的完整请求处理链路包裹在AsyncLocalStorage的run回调上下文中,只是在回调中返回了继续执行的标识,没有等待整个请求流程执行完成就退出了上下文作用域。

修复代码示例

首先确认钩子中使用的存储实例和handler中导入的是同一个实例,再修改钩子注册代码:

const { asyncLocalStorage } = require('./你存储实例的导出文件路径');

server.ext({
  type: 'onRequest',
  method(request, h) {
    return new Promise((resolve, reject) => {
      asyncLocalStorage.run({meta: {traceId: 'id'}}, async () => {
        try {
          // 等待整个请求链路执行完成再resolve,全程处于上下文作用域内
          const result = await h.continue;
          resolve(result);
        } catch (err) {
          reject(err);
        }
      })
    })
  },
})

修改后接口handler中调用asyncLocalStorage.getStore()即可正常获取存储的trace id数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:54:02