首页 > 解决方案 > 用于计算 DynamoDB 条目的 AppSync 自定义解析程序

问题描述

我有一个 React AppSync 应用程序,其中包含使用 Amplify CLI 预置的 AWS 资源。我需要获取包含数千个条目的表之一中的实体数,而不必自己获取条目。除了获取数千个实体来计算它们的愚蠢之外,我还遇到了一个问题,即我什至无法在一个请求中获取所有这些记录。像这样的简单调用:

import { API, graphqlOperation } from "aws-amplify";

const nodeData = await API.graphql(
  graphqlOperation(
    `query allNodeIds {
      listNodes(limit: 10000) {
        items {
          id
        }
      }
    }`,
    {}
  )
);

const nodeCount = nodeData.data.listNodes.items.length;

导致以下控制台错误:

...
errorType: "MappingTemplate"
message: "List size cannot exceed 1000"

似乎我需要编写一个自定义查询和解析器来计算并返回表中的条目数,但不知道从哪里开始编写解析器(在 VTL 中?),将它们放在项目中的哪个位置等。有什么帮助吗?

编辑:根据我的其他生成的解析器之一编写了一个解析器,但它似乎仍被限制为 1001 条记录,尽管我将限制设置为 9999。

架构

...
countResponses(filter: ModelResponseFilterInput, limit: Int, nextToken: String): Int

请求映射模板

#set( $limit = $util.defaultIfNull($context.args.limit, 9999) )
#set( $ListRequest = {
  "version": "2017-02-28",
  "limit": $limit
} )
#if( $context.args.nextToken )
  #set( $ListRequest.nextToken = "$context.args.nextToken" )
#end
#if( $context.args.filter )
  #set( $ListRequest.filter = $util.parseJson("$util.transform.toDynamoDBFilterExpression($ctx.args.filter)") )
#end
#if( !$util.isNull($modelQueryExpression)
                        && !$util.isNullOrEmpty($modelQueryExpression.expression) )
  $util.qr($ListRequest.put("operation", "Query"))
  $util.qr($ListRequest.put("query", $modelQueryExpression))
  #if( !$util.isNull($ctx.args.sortDirection) && $ctx.args.sortDirection == "DESC" )
    #set( $ListRequest.scanIndexForward = false )
  #else
    #set( $ListRequest.scanIndexForward = true )
  #end
#else
  $util.qr($ListRequest.put("operation", "Scan"))
#end
$util.toJson($ListRequest)

响应映射模板

## [Start] Determine request authentication mode **
#if( $util.isNullOrEmpty($authMode) && !$util.isNull($ctx.identity) && !$util.isNull($ctx.identity.sub) && !$util.isNull($ctx.identity.issuer) && !$util.isNull($ctx.identity.username) && !$util.isNull($ctx.identity.claims) && !$util.isNull($ctx.identity.sourceIp) && !$util.isNull($ctx.identity.defaultAuthStrategy) )
  #set( $authMode = "userPools" )
#end
## [End] Determine request authentication mode **
## [Start] Check authMode and execute owner/group checks **
#if( $authMode == "userPools" )
  ## No Static Group Authorization Rules **


  ## [Start] If not static group authorized, filter items **
  #if( !$isStaticGroupAuthorized )
    #set( $count = 0 )
    #foreach( $item in $ctx.result.items )
      ## No Dynamic Group Authorization Rules **


      ## [Start] Owner Authorization Checks **
      #set( $isLocalOwnerAuthorized = false )
      ## Authorization rule: { allow: owner, ownerField: "owner", identityClaim: "cognito:username" } **
      #set( $allowedOwners0 = $item.owner )
      #set( $identityValue = $util.defaultIfNull($ctx.identity.claims.get("username"), $util.defaultIfNull($ctx.identity.claims.get("cognito:username"), "___xamznone____")) )
      #if( $util.isList($allowedOwners0) )
        #foreach( $allowedOwner in $allowedOwners0 )
          #if( $allowedOwner == $identityValue )
            #set( $isLocalOwnerAuthorized = true )
          #end
        #end
      #end
      #if( $util.isString($allowedOwners0) )
        #if( $allowedOwners0 == $identityValue )
          #set( $isLocalOwnerAuthorized = true )
        #end
      #end
      ## [End] Owner Authorization Checks **


      #if( ($isLocalDynamicGroupAuthorized == true || $isLocalOwnerAuthorized == true) )
        #set( $count = $count + 1)
      #end
    #end
    #set( $ctx = $count )
  #end
  ## [End] If not static group authorized, filter items **
#end
## [End] Check authMode and execute owner/group checks **

$util.toJson($ctx)

标签: reactjsamazon-web-servicesgraphqlamazon-dynamodbaws-appsync

解决方案


推荐阅读