Implementing Query Middleware

Note: Classic prisma.$use middleware is DEPRECATED in Prisma 5+. Prefer client extensions ($extends) for new code. Both APIs are documented here for migration.

1. Creating Query Middleware

prisma.$use(async (params, next) => {
  const start = Date.now();
  const result = await next(params);
  console.log(`${params.model}.${params.action} took ${Date.now() - start}ms`);
  return result;
});
ConceptDetail
WrapsEvery Prisma query
OrderRegistered = outermost

2. Understanding Middleware Params

FieldDescription
modelAffected model name
actionfindUnique | create | update | delete | ...
argsQuery arguments (mutable)
dataPathNested query path
runInTransactionBoolean flag

3. Modifying Query Parameters

prisma.$use(async (params, next) => {
  if (params.action === "findMany") {
    params.args.where = { ...params.args.where, tenantId: ctx.tenantId };
  }
  return next(params);
});
UseDetail
Multi-tenancyInject tenant filter
Default sortInject orderBy

4. Transforming Query Results

UseDetail
RedactMask sensitive columns
DecryptDecode at-rest encrypted fields
Type coerceConvert Decimal → number

5. Implementing Soft Delete Middleware

prisma.$use(async (params, next) => {
  if (params.model === "User") {
    if (params.action === "delete") {
      params.action = "update";
      params.args.data = { deletedAt: new Date() };
    }
    if (params.action === "findMany") {
      params.args.where = { ...params.args.where, deletedAt: null };
    }
  }
  return next(params);
});
PatternDetail
Intercept deleteConvert to update
Scope readsFilter deleted rows

6. Adding Timestamps Automatically

NeedDetail
Prefer schema@default(now()) / @updatedAt
Custom audit colsAdd via middleware/extension

7. Logging Query Performance

MetricSource
DurationAround next() call
SQLEnable log: ["query"]
TracingOpenTelemetry preview

8. Chaining Multiple Middleware

OrderBehavior
First registeredOuter wrapper
Last registeredClosest to DB call

9. Using Async Middleware

AspectDetail
Async okMiddleware function is async
Avoid heavy I/OAdds latency to every query

10. Debugging Middleware Execution

ToolUse
Console logsInspect params/result
DEBUG=prisma:*Verbose driver logging
ExtensionsPrefer for new code (more granular hooks)