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

NextJs集成GraphQL Apollo时无法传递变量,报错未提供$category

问题解决:GraphQL变量未提供报错

核心原因

你的GraphQL查询定义了变量$category,但前端useQuery传入的变量键名是name,两者不匹配,导致GraphQL无法找到所需的$category变量,从而抛出错误。

修复步骤

1. 修正前端变量传递

将useQuery中的variables对象的键名从name改为category,和查询定义的变量名保持一致:

const url = useRouter();
const name = url.query.category?.toString().toLowerCase();

const { data, loading, error } = useQuery(GET_PRODUCTS, { 
  variables: { category: name } // 键名改为category,匹配查询中的$category
});

2. 处理路由参数为空的情况

在Next.js中,初始页面加载时url.query.category可能为undefined,此时即使修正了变量名,仍会因为传递undefined给非空变量$category: String!报错,可通过以下方式处理:

  • 方式一:跳过无参数时的查询
    添加skip选项,当name不存在时不执行查询:
    const { data, loading, error } = useQuery(GET_PRODUCTS, { 
      variables: { category: name },
      skip: !name // 无参数时跳过查询
    });
    
  • 方式二:修改查询变量为可选
    如果后端允许不传category时返回所有产品,可把查询中的$category: String!改为$category: String(移除!标记):
    export const GET_PRODUCTS = gql`
      query products($category: String){ // 改为可选变量
        products(category: $category) {
          title
          id
          img
          decsiprion
          brend
          price
          altDescription
          category
          article
        }
      }
    `;
    

3. 修正硬编码测试代码

之前硬编码测试时同样存在变量名不匹配问题,修正后代码如下:

const { data, loading, error } = useQuery(GET_PRODUCTS, { 
  variables: { category: 'woundrecovery' } // 键名改为category
});

额外验证

确认后端GraphQL的products查询参数定义为GraphQLString(而非非空类型),和你当前的代码一致,这样当变量可选时能正常处理无参数的请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 11:03:27