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

使用GraphQL(TypeScript)查询GetBlog时如何解决验证错误?

问题分析

你遇到的两个错误本质是后端GraphQL API的查询规则和你自定义的查询不匹配:

  • MissingFieldArgument:Amplify基于@model生成的默认getBlog查询仅支持id作为必填参数,你没传id所以报错
  • UnknownArgument:后端的getBlog接口根本没有配置name作为可接受的参数,所以传name会被判定为未知参数

另外你手动修改自动生成的queries.ts没用,因为这个文件会被Amplify的代码生成工具覆盖,且你没改动schema.graphql,amplify push自然检测不到需要更新后端的变更。

解决步骤

1. 修改Schema,添加name字段的查询索引

要让后端支持按name查询Blog,需要在schema.graphql中给name字段添加@index注解(如果name是唯一值,加上unique: true可以确保查询返回单个结果):

type Blog @model {
  id: ID!
  name: String! @index(name: "byName", unique: true)
  posts: [Post] @connection(keyName: "byBlog", fields: ["id"])
}

2. 更新后端并重新生成前端代码

执行以下命令:

# 推送schema变更到AWS,创建新的索引和对应的查询接口
amplify push
# 重新生成前端GraphQL操作代码(会覆盖queries.ts)
amplify codegen

3. 前端调用正确的查询接口

如果你的name字段是唯一的,Amplify会自动生成getBlogByName查询;如果不是唯一的,用listBlogs查询并添加过滤条件:

方式一:使用自动生成的getBlogByName(仅当name加了unique: true时可用)

import { getBlogByName } from './queries';

const getRecord = async () => {
  const result = await API.graphql(graphqlOperation(getBlogByName, {name: "testing"}))
  console.log(result) 
}

方式二:使用listBlogs过滤查询(适用于name不唯一的场景)

import { listBlogs } from './queries';

const getRecord = async () => {
  const result = await API.graphql(graphqlOperation(listBlogs, {
    filter: {
      name: { eq: "testing" }
    }
  }))
  console.log(result.data.listBlogs.items) 
}
关键注意点
  • 永远不要手动修改Amplify自动生成的queries.ts文件,所有查询变更都要通过修改schema.graphql后执行amplify codegen来生成
  • amplify push只会检测schema.graphql、Amplify配置文件的变更,修改前端代码不会触发后端更新

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 19:55:31