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

如何在GraphQL和AWS Cognito中查询已登录用户的专属数据

问题根因与修复方案

1. 核心错误:@auth规则未开放list查询权限

你当前配置的@auth规则中,allow: private仅配置了read操作,而AppSync的@auth指令默认将操作分为create、read(单条查询)、update、delete、list(列表查询)、search六类,列表查询listMembers对应的list权限没有开放,所以直接触发未授权报错。
根据你的业务需求修正Schema:

  • 若需求为仅允许用户访问自己创建的Member数据,不需要额外开放私有用户访问,直接用如下配置即可:
// 修正后Schema.graphql
type Member
  @model
  @auth(rules: [{ allow: owner, ownerField: "owner" }]) {
  id: ID!
  name: String
  owner: String
}
  • 若需要所有登录用户都可以查看全部Member列表,调整规则如下:
// 修正后Schema.graphql
type Member
  @model
  @auth(rules: [
    { allow: owner, ownerField: "owner" },
    { allow: private, operations: [read, list] }
  ]) {
  id: ID!
  name: String
  owner: String
}

修改完成后必须重新部署Schema生效,使用Amplify CLI的话执行amplify push,直接在AppSync控制台修改的话点击保存部署即可。


2. 前端代码错误修正

你的Members.js存在3处明显错误:

  • React Hook不能在组件外部声明,useState需要移到组件内部
  • GraphQL查询名拼写错误listMemberes→listMembers
  • API.graphql传参格式错误,嵌套了多余的query和variables层
    修正后完整代码:
// Members.js
import { useState, useEffect } from 'react'
import { API, Auth } from 'aws-amplify'
import { listMembers } from '../../graphql/queries'

export const Members = () => {
  // 修正:state移到组件内部
  const [members, updateMembers] = useState([])
  const [myMembers, updateMyMembers] = useState([])
  // 补全你代码里缺失的loading状态
  const [loading, updateLoading] = useState(true)

  /* fetch member's when component loads */
  useEffect(() => {
    fetchMembers()
  }, [])

  async function fetchMembers() {
    /* query the API, ask for 100 items */
    let postData = await API.graphql({
      // 修正拼写+传参格式,显式指定认证模式避免默认配置错误
      query: listMembers,
      variables: { limit: 100 },
      authMode: 'AMAZON_COGNITO_USER_POOLS'
    })

    let membersArray = postData.data.listMembers.items
    updateLoading(false)

    /* update the members array in the local state */
    setMemberState(membersArray)
  }

  async function setMemberState(membersArray) {
    const user = await Auth.currentAuthenticatedUser()
    const myMemberData = membersArray.filter((p) => p.owner === user.username)
    console.log('membersArray:', membersArray)
    updateMyMembers(myMemberData)
    updateMembers(membersArray)
  }

  // 补全渲染逻辑即可
  return <div>{loading ? '加载中' : myMembers.map(item => <div key={item.id}>{item.name}</div>)}</div>
}

3. AppSync控制台测试注意事项

如果在控制台测试查询也报错,是因为默认用了API密钥认证,不识别Cognito用户身份:

  • 进入AppSync控制台对应API的「查询」页
  • 顶部认证方式选择Amazon Cognito 用户池
  • 选择对应用户池,输入测试用户的账号密码获取令牌后再执行查询即可

额外验证点

  • 确认DynamoDB中Member数据的owner字段值,和对应Cognito用户的username完全一致,大小写也要匹配
  • 确认项目中Amplify的Auth配置已正确初始化,用户登录状态正常,调用Auth.currentAuthenticatedUser()可以正常拿到用户信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 11:54:03