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

基于AWS Amplify的Expo应用DataStore查询权限异常求助

AWS Amplify 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(根据需求)。
  • 验证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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:41:19