如何在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
相关产品推荐
相关产品推荐

