Как запретить запуск запроса, если источник пуст? - PullRequest
0 голосов
/ 09 октября 2018

Рассмотрим следующий шаблон GraphQL:

type Foo {
  id: ID!
  bars: Bars
}

type Bar {
  id: ID!
  name: String!
}

type Bars {
  items: [Bar]!
  nextToken: String
}

Шаблон отображения для поля bars в типе Foo выглядит следующим образом:

#set($ids = [])
#foreach($id in $context.source.bars)
    #set($map = {})
    $util.qr($map.put("id", $util.dynamodb.toString($id)))
    $util.qr($ids.add($map))
#end
{
    "version" : "2018-05-29",
    "operation" : "BatchGetItem",
    "tables" : {
        "barsTable" : {
             "keys": $util.toJson($ids),
             "consistentRead": true
         }
     }
}

Это работает хорошо.Но если в поле bars содержится и пустой массив [], шаблон, очевидно, вылетит со следующей ошибкой:

"errors": [
    {
      "path": [
        "getFoo",
        "bars"
      ],
      "data": null,
      "errorType": "MappingTemplate",
      "errorInfo": null,
      "locations": [
        {
          "line": 59,
          "column": 7,
          "sourceName": null
        }
      ],
      "message": "RequestItem keys '$[tables][barsTable]' can't be empty"
    }
  ]

Итак, мой вопрос:
Как предотвратитьвыполнить запрос и просто вернуть пустой массив в шаблон ответа, когда $context.source.bars пусто?

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Я попытался воспроизвести ваш сценарий использования и, наконец, придумал один прием для решения проблемы.
Пример схемы:

type Query {
    getTests(ids: [ID!]): [Test]
}
type Test {
    id: ID!
    title: String!
}
schema {
    query: Query
}

Решение

## REQUEST MAPPING
#set($ids = [])
## CREATE A FAKE-ID TO RETURN NULL ONLY IF ids IS NULL OR EMPTY
#if( $ctx.args.ids.isEmpty() || $util.isNull($ctx.args.ids) )
  #set($map = {})
  $util.qr($map.put("id", $util.dynamodb.toString("fake-id-to-return-null")))
  $util.qr($ids.add($map))
#else
  #foreach($id in $ctx.args.ids)
      #set($map = {})
      $util.qr($map.put("id", $util.dynamodb.toString($id)))
      $util.qr($ids.add($map))
  #end
#end

{
    "version" : "2018-05-29",
    "operation" : "BatchGetItem",
    "tables" : {
        "TestTable": {
            "keys": $util.toJson($ids),
            "consistentRead": true
        }
    }
}

## RESPONSE MAPPING
$utils.toJson($ctx.result.data.TestTable)

Другое подобное решение

#if( !($util.isNull($ctx.args.ids) || $ctx.args.ids.isEmpty()) ) 
    #set($ids = [])
    #foreach($id in $ctx.args.ids)
        #set($map = {})
        $util.qr($map.put("id", $util.dynamodb.toString($id)))
        $util.qr($ids.add($map))
    #end
    {
        "version" : "2018-05-29",
        "operation" : "BatchGetItem",
        "tables" : {
            "TestTable": {
                "keys": $util.toJson($ids),
                "consistentRead": true
            }
        }
    }
#else
    {
        "version": "2017-02-28",
        "operation": "GetItem",
        "key": {
            "id": $util.dynamodb.toDynamoDBJson("."),
        }
    }
#end

Тестирование

enter image description here

enter image description here

enter image description here

0 голосов
/ 10 октября 2018

Вы можете использовать

#if(!$array.isEmpty())
   //do something
#else
  //do something else
#end

Для получения дополнительной информации вы можете обратиться к справочному руководству по шаблону сопоставления резольверов здесь

...