如何在 Nextjs 中间件中使用 Hook?
How to use Hook inside Nextjs middleware?
我有这样的中间件
import type { NextFetchEvent, NextRequest } from "next/server";
import { NextResponse } from "next/server";
import { useCheckIsAdminQuery } from "../../generated/graphql";
export function middleware(req: NextRequest, ev: NextFetchEvent) {
const {data,loading,error} = useCheckIsAdminQuery()
if(data?.checkIsAdmin){
return NextResponse.next()
}else{
const url = req.nextUrl.clone()
url.pathname = '/404'
return NextResponse.redirect(url)
}
}
useCheckIsQuery() 只是一个钩子是由 codegen 包生成的,但我不能在中间件中调用这个钩子。
错误显示
Invalid hook call. Hooks can only be called inside of the body of a function component.
我该如何解决?
根据 React 文档:“Don't call Hooks inside loops, conditions, or nested functions. Instead, always use Hooks at the top level of your React function, before any early returns.
”。
Nextjs 的中间件不是 React 函数,所以你不能在里面使用 hooks。解决你的问题的方法是用你的自定义逻辑创建一个钩子,并在你想要生效的页面中手动调用它。
我有这样的中间件
import type { NextFetchEvent, NextRequest } from "next/server";
import { NextResponse } from "next/server";
import { useCheckIsAdminQuery } from "../../generated/graphql";
export function middleware(req: NextRequest, ev: NextFetchEvent) {
const {data,loading,error} = useCheckIsAdminQuery()
if(data?.checkIsAdmin){
return NextResponse.next()
}else{
const url = req.nextUrl.clone()
url.pathname = '/404'
return NextResponse.redirect(url)
}
}
useCheckIsQuery() 只是一个钩子是由 codegen 包生成的,但我不能在中间件中调用这个钩子。 错误显示
Invalid hook call. Hooks can only be called inside of the body of a function component.
我该如何解决?
根据 React 文档:“Don't call Hooks inside loops, conditions, or nested functions. Instead, always use Hooks at the top level of your React function, before any early returns.
”。
Nextjs 的中间件不是 React 函数,所以你不能在里面使用 hooks。解决你的问题的方法是用你的自定义逻辑创建一个钩子,并在你想要生效的页面中手动调用它。