You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js中使用next-auth调用GraphQL Hook触发无效Hook调用错误求助

问题分析与解决方案

错误原因

你遇到的Invalid hook call错误,核心是违反了React Hook的使用规则:useLoginUserMutation是React Hook,仅能在函数组件顶层或自定义Hook中调用,而你在CredentialsProvider的authorize普通异步回调里调用它,完全不符合Hook的使用场景,因此触发报错。

解决步骤

不能在authorize中使用生成的Hook,需要直接通过GraphQL客户端的原生方法发送登录请求,具体修改如下:

1. 初始化GraphQL客户端实例

在[...nextauth].ts中创建独立的GraphQL客户端实例(不要用Hook获取客户端):

import NextAuth, { NextAuthOptions } from 'next-auth'
import CredentialsProvider from 'next-auth/providers/credentials'
import { ApolloClient, InMemoryCache } from '@apollo/client'
// 导入Codegen生成的mutation文档
import { LoginUserDocument } from 'src/generated/graphql'

// 初始化Apollo客户端
const graphQLClient = new ApolloClient({
  uri: '你的GraphQL API地址', // 替换为实际API地址
  cache: new InMemoryCache(),
})

2. 修改authorize回调逻辑

在authorize中使用客户端的mutate方法执行登录请求:

export const nextAuthOptions = {
  pages: {
    signIn: '/pages/login'
  },
  providers: [
    CredentialsProvider({
      name: 'Credentials',
      credentials: {},
      async authorize(credentials, req) {
        const { username, password } = credentials as { username: string; password: string }
        
        try {
          // 直接调用GraphQL客户端的mutate方法
          const { data } = await graphQLClient.mutate({
            mutation: LoginUserDocument, // 使用Codegen生成的mutation文档
            variables: { username, password }
          })

          if (data?.loginUser) {
            // 返回用户信息给next-auth
            return data.loginUser
          }
        } catch (err) {
          console.error('登录验证失败:', err)
        }

        return null
      }
    })
  ]
} as NextAuthOptions

export default NextAuth(nextAuthOptions)

注意事项

  • authorize函数默认在服务器端运行,要确保GraphQL API地址在服务器端可正常访问(避免使用相对路径,处理好跨域)。
  • 如果使用其他GraphQL客户端,替换为对应客户端的原生请求方法即可,核心是不在非组件/非Hook环境中调用React Hook。

内容的提问来源于stack exchange,提问作者Bishal Heuju

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 08:03:13