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

Flutter使用AWS Amplify调用GraphQL API无返回数据且无报错问题

问题根因

  • 最核心的问题是GraphQL变量名不匹配,请求在API Gateway的GraphQL校验阶段就被驳回,根本没有触发后端Lambda,所以你看不到CloudWatch调用日志。
    你在查询开头声明的变量是$userId: ID!,但实际调用查询时用了未声明的变量$id,同时传参时的变量key用的也是id,和声明的userId完全不匹配。
  • 第二个隐藏问题:你没有打印response.errors,GraphQL层面的校验错误、业务错误不会抛出ApiException,只会存在于response.errors字段中,所以你之前看不到任何报错提示,只拿到空的data。
  • 第三个潜在问题:你的Lambda代码存在重复定义逻辑,如果是单文件部署的话,开头的const getUserById = require('./user-queries/getUserById');是冗余代码,会和你后面定义的同名函数冲突。

修复代码

前端API调用代码

void findUser() async {
  try {
    // 统一变量名,声明的$userId和调用时的$userId保持一致
    String graphQLDocument = '''query getUserById(\$userId: ID!) {
    getUserById(userId: \$userId) {
    id
    name
  }
}''';

    var operation = Amplify.API.query(
        request: GraphQLRequest<String>(
            document: graphQLDocument,
            // 变量key和声明的userId保持一致
            variables: {'userId': 'USER-14160000000'}));

    var response = await operation.response;
    // 新增错误打印,捕获GraphQL层面的错误
    if (response.errors.isNotEmpty) {
      print('GraphQL errors: ${response.errors}');
    }
    var data = response.data;
    print('Query result: ${data.toString()}');
  } on ApiException catch (e) {
    print('Query failed: $e');
  }
}

Lambda代码(单文件部署版)

// 移除冗余的require语句,避免同名函数冲突
exports.handler = async (event) => {
   var userId = event.arguments.userId;
   var name = event.arguments.name;
   var avatarUrl = event.arguments.avatarUrl;
   console.log(userId);
   switch(event.info.fieldName) {
       case "getUserById": 
           return getUserById(userId);
       // 新增default分支避免无返回值
       default:
           return null;
   }
 };

const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient({region: 'ca-central-1'});

async function getUserById(userId) {
    const params = {
        TableName:"Bol-Table",
        KeyConditionExpression: 'pk = :hashKey and sk = :sortKey',
        ExpressionAttributeValues: {
            ':hashKey': userId,
            ':sortKey': 'USER'
        }
    };
    try {
        const queryResult = await docClient.query(params).promise();
        console.log(queryResult);
        // 新增判空逻辑,避免查询无结果时报错
        if (!queryResult.Items || queryResult.Items.length === 0) {
            console.log("未查询到对应用户,id:" + userId);
            return null;
        }
        const item = queryResult.Items[0];
        return { 
            id: item.pk, 
            name: item.details?.displayName,
            avatarUrl: item.details?.avatarUrl,
            createdAt: item.details?.createdAt,
            updatedAt: item.details?.updatedAt
        };
    } catch(err) {
        console.log("BOL Error: ", err);
        return null;
    }
 }
 
 module.exports = getUserById;

额外排查建议

如果修复后仍然看不到Lambda调用日志,可以检查AppSync/API Gateway的权限配置,确认是否有调用Lambda函数的权限,同时确认GraphQL Schema的入参定义和你的请求参数一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 21:15:06