基于AWS Amplify的Expo应用DataStore查询权限异常求助
我有一个基于AWS Amplify的Expo应用,此前运行完全正常。几天前尝试在useEffect的查询逻辑中加入Subscription后出现异常,即便已经移除了Subscription相关代码,仍持续报错:
DataStore - User is unauthorized to query syncCustomers with auth mode API_KEY. No data could be returned.
导致无法从后端获取数据。查阅相关资料未找到现成解决方案,虽有信息指出问题与Auth mode相关,但调整配置后仍未解决。
代码示例
import { useWindowDimensions, TouchableOpacity } from "react-native"; import React, { useEffect, useState } from "react"; import MapView, { PROVIDER_GOOGLE } from "react-native-maps"; import { Amplify, AuthModeStrategyType } from "aws-amplify"; import awsconfig from "../aws-exports"; import { DataStore } from "@aws-amplify/datastore"; import { House, Lands } from "../models"; import LandMark from "../components/LandMark"; import { GestureHandlerRootView } from "react-native-gesture-handler"; import HouseMark from "../components/HouseMark"; import { mapStyle } from "../utils"; Amplify.configure({ ...awsconfig, Analytics: { disabled: true, }, DataStore: { authModeStrategyType: AuthModeStrategyType.MULTI_AUTH, }, }); const SellScreen = () => { const [houses, setHouses] = useState(); const [terrain, setTerrain] = useState(); const { width, height } = useWindowDimensions(); useEffect(() => { try { DataStore.query(Lands, (l) => l.available.eq(true)).then(setTerrain); DataStore.query(House, (h) => h.available.eq(true)).then(setHouses); } catch (error) { console.log(error); } }, []); return ( <GestureHandlerRootView className=" flex-1"> <MapView provider={PROVIDER_GOOGLE} style={{ width, height, }} customMapStyle={mapStyle} initialRegion={{ latitude: 1, longitude: 2, latitudeDelta: 0.7, longitudeDelta: 0.7, }} > {terrain && terrain.map((land, id) => ( <TouchableOpacity key={id}> <LandMark land={land} /> </TouchableOpacity> ))} {houses && houses.map((house, id) => ( <TouchableOpacity key={id}> <HouseMark house={house} /> </TouchableOpacity> ))} </MapView> </GestureHandlerRootView> ); }; export default SellScreen;
补充信息
- 使用Amplify Studio管理模型,未手动编写GraphQL代码
- 报错截图:

排查解决步骤
确认DataStore多认证配置生效
虽然代码中设置了AuthModeStrategyType.MULTI_AUTH,需登录AWS控制台,检查DataStore关联的AppSync API是否启用了多认证模式,且API_KEY、当前用户使用的认证方式(如Cognito用户池)均已配置并启用。清理本地DataStore缓存
本地缓存可能残留了Subscription相关的旧认证状态或数据,可在App启动时临时添加缓存清理逻辑:// 仅执行一次,清理完成后可移除 useEffect(async () => { await DataStore.clear(); }, []);检查模型权限配置
打开Amplify Studio,进入House和Lands模型的权限设置页面,确保查询(Query)权限对当前使用的认证方式开放:- 若使用API_KEY,需勾选
API Key权限; - 若使用Cognito用户,需勾选
Authenticated users或Guest users(根据需求)。
- 若使用API_KEY,需勾选
验证aws-exports配置
检查aws-exports.js文件,确认aws_appsync_authenticationType(默认认证方式)和aws_appsync_additional_authentication_types(额外认证方式)包含你需要的认证类型,比如同时包含API_KEY和AMAZON_COGNITO_USER_POOLS。重新生成模型文件
权限修改后模型文件可能未同步,执行以下命令重新生成:amplify codegen models
内容的提问来源于stack exchange,提问作者Laspeed

