我在/myproject/pages/middleware.js
:中有middleware.js
文件
export function middleware(request) {
console.log(1);
return NextResponse.redirect(new URL('/', request.url));
}
// See "Matching Paths" below to learn more
export const config = {
matcher: ['/test'],
};
现在我期望的是,当我转到页面/test
时,它应该将我重定向到/
。然而,什么都没发生,我看到了我的标准404页面。
有什么想法吗?
NextJs版本:12.2.2
NextJS的最新版本要求用户拥有与pages文件夹位于同一级别的单个中间件文件。
请尝试使用{root}/middleware.js
而不是{root}/pages/middleware.js
,如果您有src
文件夹,请尝试{root}/src/middleware.js
。
对于下一个13.0.2/13.0.1,如果您使用的是appDir:true(实验)
如果你想使用中间件:
-
将middleware.ts放入根项目:(与"应用程序"文件夹的层次结构相同,不在应用程序文件夹内…)
-
确保tsconfig包含:[…,"middleware.ts"]
-
使空";页面";文件夹(基于问题)
-
将满足每个请求:
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'
export function middleware(request: NextRequest ) {
console.log('lol!!!')
}
export const config = {
matcher: '/',
}
https://github.com/vercel/next.js/discussions/38546#discussioncomment-3127906
这最终成为了我的解决方案。我用的是下一个13.1。如果您使用src文件夹,则需要在{root}/src/middleware.ts
中使用中间件
在我的情况下,它没有被调用,因为我在next.config.js
文件中像这样使用pageExtensions
。
const nextConfig = {
reactStrictMode: true,
pageExtensions: ["page.tsx", "api.ts"],
};
因此,在我的情况下,应该调用中间件,middleware.page.ts
或middleware.api.ts
。我花了一段时间才弄明白。
如果您的页面和中间件不在同一级别,那么它将无法工作。下面是一个使用Cookie的中间件示例。
import { NextResponse } from "next/server";
export default function middleware(req){
let verify = req.cookies.get("loggedin");
let url = req.url
if(!verify && url.includes('/dashboard')){
return NextResponse.redirect("http://localhost:3000/");
}
if (verify && url === "http://localhost:3000/") {
return NextResponse.redirect("http://localhost:3000/dashboard");
}
}
如果您使用的NextJS版本低于12.2.2,则需要:
- 用
_middleware.ts
或_middlware.js
命名文件 - 将其放置在
pages
目录中
https://nextjs.org/docs/messages/middleware-upgrade-guide
一切都很简单(Next.js 13 app_dir):
- 检查路径:
src/middleware.ts
- 注意,如果您将TS扩展用于中间件,请不要忘记TS扩展
pageExtensions: ['ts', 'tsx']
(next.config.js)
完成。
只是插话,我的错误是我调用了我的文件"middelware.ts";而不是";中间件.ts";,错误地切换";l〃;以及";e";。。。