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

如何在Prisma日志事件订阅处理器中获取Express请求头?

解决方案:利用AsyncLocalStorage共享请求上下文

不需要修改每一处Prisma调用,你可以用Node.js的AsyncLocalStorage在异步调用链中隐式传递请求头信息,具体步骤如下:

1. 初始化AsyncLocalStorage

创建单独模块管理上下文存储:

// src/context.ts
import { AsyncLocalStorage } from 'async_hooks';

export const asyncLocalStorage = new AsyncLocalStorage<{
  requestHeaders: Record<string, string | undefined>;
}>();

2. 添加Express中间件捕获请求头

在Express应用中加入全局中间件,把请求头存入上下文:

// src/app.ts
import { asyncLocalStorage } from './context';
import express from 'express';

const app = express();

// 全局中间件:存储请求头到上下文
app.use((req, res, next) => {
  asyncLocalStorage.run(
    { requestHeaders: req.headers },
    next
  );
});

// 注册你的路由
app.use('/your-endpoint', yourController.endpoint);

3. 修改logQuery函数读取上下文

更新Prisma日志订阅逻辑,从上下文取出请求头:

import { asyncLocalStorage } from './context';

const logQuery = (event: Prisma.QueryEvent) => {
  const context = asyncLocalStorage.getStore();
  const someHeader = context?.requestHeaders['x-some-header'];
  
  console.log(`query: ${event.query}`);
  if (someHeader) {
    console.log(`X-Some-Header: ${someHeader}`);
  }
};

prisma.$on('query', logQuery);

这样每个请求触发的Prisma查询都会自动带上对应请求头信息,完全不需要修改任何Prisma调用的参数。

原理说明

AsyncLocalStorage会在当前异步调用链(从Express中间件到控制器,再到Prisma查询)中维护独立的上下文存储,链内所有异步操作都能访问同一上下文数据,完美适配你的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 14:46:01