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

