使用AppSync JS解析器查询DynamoDB返回null问题排查求助
AppSync JS解析器查询DynamoDB返回null,但CloudWatch显示已获取数据
自定义AppSync JS解析器查询DynamoDB时始终返回null,但CloudWatch日志明确显示已经成功获取到数据,请求帮忙定位问题。
AppSync 查询

JS 解析器代码
import { util } from '@aws-appsync/utils'; import * as ddb from "@aws-appsync/utils/dynamodb"; export function request(ctx) { const { PK, limit = 20, nextToxen} = ctx.args; return ddb.query({ query: {PK: {eq: "SUE#" + PK} }, limit, nextToxen, }); } export function response(ctx) { return ctx.result; }
CloudWatch 日志
{ "logType": "AfterResponseFunctionEvaluation", "path": [ "querySuE" ], "fieldName": "querySuE", "resolverArn": "arn:aws:appsyncxxxxxx", "requestId": "xxxxxxxxx", "context": { "arguments": { "PK": "zzzzz" }, "result": { "items": [ { "createdAt": "2024-06-09T20:40:30.940Z", "SK": "SUE#01HZZBPBEWXBCSMZMKG8MHF16Q", "PK": "SUE#zzzzz", "_TYPE": "SUE", "title": "ichbintitel" }, { "createdAt": "2024-06-09T20:40:31.468Z", "SK": "SUE#01HZZBPBZC6Q4WW003GQR1HXWC", "PK": "SUE#zzzzz", "_TYPE": "SUE", "title": "ichbintitel" } ], "scannedCount": 2 }, "prev": { "result": { "items": [ { "createdAt": "2024-06-09T20:40:30.940Z", "SK": "SUE#01HZZBPBEWXBCSMZMKG8MHF16Q", "PK": "SUE#zzzzz", "_TYPE": "SUE", "title": "ichbintitel" }, { "createdAt": "2024-06-09T20:40:31.468Z", "SK": "SUE#01HZZBPBZC6Q4WW003GQR1HXWC", "PK": "SUE#zzzzz", "_TYPE": "SUE", "title": "ichbintitel" } ], "scannedCount": 2 } }, "stash": {}, "outErrors": [] }, "fieldInError": false, "evaluationResult": { "items": [ { "createdAt": "2024-06-09T20:40:30.940Z", "SK": "SUE#01HZZBPBEWXBCSMZMKG8MHF16Q", "PK": "SUE#zzzzz", "_TYPE": "SUE", "title": "ichbintitel" }, { "createdAt": "2024-06-09T20:40:31.468Z", "SK": "SUE#01HZZBPBZC6Q4WW003GQR1HXWC", "PK": "SUE#zzzzz", "_TYPE": "SUE", "title": "ichbintitel" } ], "scannedCount": 2 }, "errors": [], "parentType": "Query", "graphQLAPIId": "xxxxxxxxx" }
问题定位与解决建议
从CloudWatch日志可以确认,解析器已经成功从DynamoDB获取到数据(evaluationResult包含完整的items列表),返回null的核心原因几乎都是GraphQL Schema定义与解析器返回的数据结构不匹配,按以下步骤排查:
核对GraphQL Schema的返回类型定义
- 确保
Query类型中的querySuE字段返回类型,和解析器返回的{ items: [...], scannedCount: number }结构一致。比如是否定义了对应的嵌套类型:type SUEItem { createdAt: String SK: String PK: String _TYPE: String title: String } type SUEQueryResult { items: [SUEItem] scannedCount: Int } type Query { querySuE(PK: String!, limit: Int, nextToken: String): SUEQueryResult } - 如果Schema里
querySuE被定义为直接返回[SUEItem](列表类型),而解析器返回的是包含items的对象,结构不匹配就会导致客户端拿到null。
- 确保
调整解析器返回值结构
- 如果Schema期望直接返回数据列表,修改response函数,返回
ctx.result.items而非整个ctx.result:export function response(ctx) { return ctx.result.items; }
- 如果Schema期望直接返回数据列表,修改response函数,返回
修正参数拼写错误
- 解析器中
nextToxen是拼写错误,正确应为nextToken,虽然本次请求未传该参数,但后续分页功能会受影响,建议修正。
- 解析器中
内容的提问来源于stack exchange,提问作者Sami
相关产品推荐
相关产品推荐

