如何为Prisma查询命名以便在日志中使用该名称?
Prisma查询命名与中间件日志方案
Prisma本身没有专门的内置语法为单个查询指定名称,但你可以通过以下几种方式实现给查询命名并在日志中间件中识别的需求:
1. 使用meta自定义元数据(推荐)
Prisma Client 2.20及以上版本支持在查询中添加meta选项,用于传递自定义元数据。你可以在这里为每个查询设置唯一名称,然后在中间件中读取该值。
查询示例
// 获取单个用户(按ID) const userById = await prisma.user.findUnique({ where: { id: 1 }, meta: { queryName: "getUserById" } }); // 获取活跃用户列表 const activeUsers = await prisma.user.findMany({ where: { isActive: true }, meta: { queryName: "getActiveUsers" } }); // 获取用户关联的订单 const userWithOrders = await prisma.user.findUnique({ where: { id: 1 }, include: { orders: true }, meta: { queryName: "getUserWithOrders" } });
中间件中读取查询名称
prisma.$use(async (params, next) => { const queryName = params.meta?.queryName || "unnamedQuery"; console.log(`Executing query: ${queryName}`); const result = await next(params); console.log(`Query ${queryName} completed`); return result; });
2. 封装自定义查询函数
把不同的用户查询逻辑封装成独立的函数,函数名本身就可以作为查询标识,同时在函数内部统一设置meta字段,避免重复代码:
async function getUserById(prisma: PrismaClient, userId: number) { return prisma.user.findUnique({ where: { id: userId }, meta: { queryName: "getUserById" } }); } async function getActiveUsers(prisma: PrismaClient) { return prisma.user.findMany({ where: { isActive: true }, meta: { queryName: "getActiveUsers" } }); }
这种方式既提高了代码复用性,也确保每个查询的名称统一且易于维护。
3. 结合请求上下文(框架场景)
如果你在使用如NestJS、Express等框架,可以在请求上下文中传递查询标识,再在Prisma中间件中读取上下文信息。比如在Express中:
// 路由中设置查询名称 app.get('/users/:id', async (req, res) => { req.queryName = "getUserById"; const user = await prisma.user.findUnique({ where: { id: parseInt(req.params.id) } }); res.json(user); }); // Prisma中间件读取上下文 prisma.$use(async (params, next) => { const queryName = (params as any).ctx?.queryName || "unnamedQuery"; // 日志逻辑... return next(params); });
注意这种方式需要额外处理上下文传递,适合框架集成场景。
内容的提问来源于stack exchange,提问作者iserdmi
相关产品推荐
相关产品推荐

