我在Next.js项目里写了个中间件想拦截动态路由/api/posts/:id,但访问具体ID时还是报404…
代码是这样的:
export const config = {
matcher: '/api/posts/:id'
}
export default function middleware(req, res) {
console.log('拦截到请求!')
// ...
}
但访问/api/posts/123时控制台没输出,直接返回404。我检查过文件路径和拼写都没问题,这是哪里设置错了?
matcher配置上。Next.js 的中间件匹配规则有点坑,动态路由需要特别注意。你现在的
matcher写的是'/api/posts/:id',但 Next.js 不支持直接用这种带参数的方式匹配动态路径。正确的写法是:重点是加了个
*,这样就可以匹配/api/posts/后面的所有内容了。记得req.nextUrl.searchParams和req.nextUrl.pathname可以用来获取具体参数。另外提醒一下,
res在中间件里是不存在的,只有req和next(),官方文档这块确实容易让人误解。改完试试,应该就不会404了。