Next.js Middleware fails on Edge Runtime but works with runtime: 'nodejs' on Vercel.
I’m experiencing an issue where Next.js Middleware (middleware.ts) does not execute at all when deployed to Vercel using the default Edge Runtime. However, adding export const runtime = 'nodejs' makes it work correctly.
Environment
- Framework:
Next.js15.5.9(App Router) - Deployment:
Vercel(Production & Preview) - Dependencies:
@clerk/nextjs6.36.5, but issue persists even with minimal middleware - Local dev: Works fine with
Edge Runtime(next dev)
Configuration
// middleware.ts (Edge - NOT working on Vercel)
import { clerkMiddleware } from '@clerk/nextjs/server'
export default clerkMiddleware()
export const config = {
matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'],
}
// middleware.ts (Node.js - WORKING on Vercel)
export const runtime = 'nodejs' // Adding this fixes it
import { clerkMiddleware } from '@clerk/nextjs/server'
export default clerkMiddleware()
Observed Behavior
- With default Edge Runtime: Middleware never executes (no logs in
VercelFunction Logs). - Error:
auth()throws:
“can’t detect usage of clerkMiddleware()”
(because the middleware chain is broken).
- With
runtime = 'nodejs': Middleware executes correctly on every matched request.
Steps Tried
- Simplified matcher to catch-all patterns
- Cleared
Vercelbuild cache & redeployed - Upgraded to latest
Next.jsand@clerk/nextjsversions - Verified file location (
src/middleware.tsat project root level)
Expected Behavior
Edge Runtime should work as documented for Middleware, or documentation should clarify when Node.js runtime is required.
Additional Context
Issue appears specific to Vercel build environment; local next dev works fine with Edge Runtime.