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

