扩展 - Amazon AppSync
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

扩展

$extensions包含一组用于在解析器中进行其他操作的方法。

$扩展。 evictFromApi缓存(字符串、字符串、对象):对象

从Amazon AppSync 服务器端缓存中逐出项目。第一个参数是类型名称。第二个参数是字段名称。第三个参数是一个包含指定缓存键值的键值对项的对象。必须按照与缓存解析器中的缓存键相同的顺序将项目放入对象中cachingKey

注意

此实用程序仅适用于突变,不适用于查询。

$扩展。 setSubscriptionFilter(filterJsonObject)

定义增强的订阅筛选条件。每个订阅通知事件都会根据提供的订阅过滤器进行评估,如果所有筛选器的评估结果均为,则向客户端发送通知true。该参数filterJsonObject如下所述。

注意

您只能在订阅解析器的响应映射模板中使用此扩展方法。

$扩展。 setSubscriptionInvalidation过滤器 (filterJsonObject)

定义订阅失效过滤器。订阅筛选器根据失效负载进行评估,如果过滤器的计算结果为,则使给定订阅失效true。该参数filterJsonObject如下所述。

注意

您只能在订阅解析器的响应映射模板中使用此扩展方法。

争论: filterJsonObject

JSON 对象定义了订阅过滤器或失效过滤器。它是 a 中的一个过滤器数组filterGroup。每个过滤器都是单个过滤器的集合。

{ "filterGroup": [ { "filters" : [ { "fieldName" : "userId", "operator" : "eq", "value" : 1 } ] }, { "filters" : [ { "fieldName" : "group", "operator" : "in", "value" : ["Admin", "Developer"] } ] } ] }

每个过滤器都有三个属性:

  • fieldName— GraphQL 架构字段。

  • operator— 运算符类型。

  • value— 要与订阅通知fieldName值比较的值。

以下是这些属性的赋值示例:

{ "fieldName" : "severity", "operator" : "le", "value" : $context.result.severity }

字段:fieldName

字符串类型fieldName是指在 GraphQL 架构中定义的字段,该字段与订阅通知负载fieldName中的相匹配。找到匹配项后,会将value GraphQL 架构字段value的字段与订阅通知过滤器的字段进行比较。在以下示例中,fieldName过滤器与给定 GraphQL 类型中定义的service字段相匹配。如果通知负载包含value等效于的service字段AWS AppSync,则过滤器的计算结果为true

{ "fieldName" : "service", "operator" : "eq", "value" : "AWS AppSync" }

字段:值

根据运算符,该值可以是不同的类型:

  • 单个数字或布尔值

    • 字符串示例:"test""service"

    • 数字示例:1245.75

    • 布尔值示例:truefalse

  • 成对的数字或字符串

    • 字符串对示例:["test1","test2"]["start","end"]

    • 数字对示例:[1,4][67,89][12.45, 95.45]

  • 数字或字符串数组

    • 字符串数组示例:["test1","test2","test3","test4","test5"]

    • 数字数组示例:[1,2,3,4,5][12.11,46.13,45.09,12.54,13.89]

字段:操作员

区分大小写的字符串,具有以下可能的值:

操作符 描述 可能的值类型
eq Equal integer, float, string, Boolean
ne Not equal integer, float, string, Boolean
le Less than or equal integer, float, string
lt Less than integer, float, string
ge Greater than or equal integer, float, string
gt Greater than integer, float, string
contains Checks for a subsequence or value in the set. integer, float, string
notContains Checks for the absence of a subsequence or absence of a value in the set. integer, float, string
beginsWith Checks for a prefix. string
in Checks for matching elements that are in the list. Array of integer, float, or string
notIn Checks for matching elements that aren't in the list. Array of integer, float, or string
between Between two values integer, float, string
containsAny Contains common elements integer, float, string

下表描述了在订阅通知中如何使用每个运算符。

eq (equal)

eq运算符的计算结果是订阅通知字段值true是否匹配并且严格等于筛选器的值。在以下示例中,筛选器的计算结果为订阅通知true是否包含值等于的service字段AWS AppSync

可能的值类型:整数、浮点数、字符串、布尔值

{ "fieldName" : "service", "operator" : "eq", "value" : "AWS AppSync" }
ne (not equal)

ne算符评估订阅通知字段的值true是否与筛选器的值不同。在以下示例中,筛选器的计算结果是订阅通知的service字段值true是否与不同AWS AppSync

可能的值类型:整数、浮点数、字符串、布尔值

{ "fieldName" : "service", "operator" : "ne", "value" : "AWS AppSync" }
le (less or equal)

le运算符的计算结果是订阅通知字段值true是否小于或等于筛选器的值。在以下示例中,筛选器的计算结果是订阅通知的size字段值true是否小于或等于5

可能的值类型:整数、浮点数、字符串

{ "fieldName" : "size", "operator" : "le", "value" : 5 }
lt (less than)

lt运算符的计算结果是订阅通知字段的值true是否低于筛选器的值。在以下示例中,筛选器的计算结果是订阅通知的size字段值true是否小于5

可能的值类型:整数、浮点数、字符串

{ "fieldName" : "size", "operator" : "lt", "value" : 5 }
ge (greater or equal)

ge运算符的计算结果是订阅通知字段值true是否大于或等于筛选器的值。在以下示例中,筛选器的计算结果是订阅通知的size字段值true是否大于或等于5

可能的值类型:整数、浮点数、字符串

{ "fieldName" : "size", "operator" : "ge", "value" : 5 }
gt (greater than)

gt运算符的计算结果是订阅通知字段的值true是否大于筛选器的值。在以下示例中,筛选器的计算结果为订阅通知的size字段值true是否大于5

可能的值类型:整数、浮点数、字符串

{ "fieldName" : "size", "operator" : "gt", "value" : 5 }
contains

contains算符检查集合或单个项目中的子字符串、子序列或集合中的值。带有contains运算符的筛选器的计算结果为订阅通知字段值true是否包含筛选器值。在以下示例中,筛选器的计算结果为订阅通知true是否包含包含该值的数组值的seats字段10

可能的值类型:整数、浮点数、字符串

{ "fieldName" : "seats", "operator" : "contains", "value" : 10 }

在另一个示例中,过滤器的计算结果是订阅通知true是否包含launch子字符串event字段。

{ "fieldName" : "event", "operator" : "contains", "value" : "launch" }
notContains

notContains算符检查集合或单个项目中是否不存在子字符串、子序列或集合中的值。true如果订阅通知字段值不包含筛选器值,则带notContains运算符的筛选器的计算结果为。在以下示例中,筛选器的计算结果是订阅通知中true是否包含数组值的seats字段不包含该值10

可能的值类型:整数、浮点数、字符串

{ "fieldName" : "seats", "operator" : "notContains", "value" : 10 }

在另一个示例中,筛选器评估订阅通知true是否具有不带子序launch列的event字段值。

{ "fieldName" : "event", "operator" : "notContains", "value" : "launch" }
beginsWith

beginsWith算符检查字符串中是否有前缀。包含beginsWith运算符的过滤器的计算结果为订阅通知字段值true是否以筛选器的值开头。在以下示例中,筛选器的计算结果是订阅通知中true是否包含以开头的service字段AWS

可能的值类型:字符串

{ "fieldName" : "service", "operator" : "beginsWith", "value" : "AWS" }
in

in算符检查数组中是否有匹配的元素。包含in运算符的过滤器的计算结果为数组中true是否存在订阅通知字段值。在以下示例中,筛选器的计算结果是订阅通知中true是否包含数组中存在的值之一的severity字段:[1,2,3]

可能的值类型:整数、浮点数或字符串数组

{ "fieldName" : "severity", "operator" : "in", "value" : [1,2,3] }
notIn

notIn算符检查数组中是否缺少元素。true如果数组中不存在订阅通知字段值,则包含notIn运算符的过滤器的计算结果为。在以下示例中,筛选器的计算结果为订阅通知中true是否包含一个数组中不存在的值:[1,2,3]severity

可能的值类型:整数、浮点数或字符串数组

{ "fieldName" : "severity", "operator" : "notIn", "value" : [1,2,3] }
between

between算符检查两个数字或字符串之间的值。包含between运算符的过滤器的计算结果是订阅通知字段值true是否介于筛选器的值对之间。在以下示例中,筛选器评估为订阅通知true是否包含值的severity字段234

可能的值类型:一对整数、浮点数或字符串

{ "fieldName" : "severity", "operator" : "between", "value" : [1,5] }
containsAny

containsAny算符检查数组中是否有常用元素。带有containsAny运算符的筛选器的计算结果为订阅通知字段集值和筛选器设置值的交叉点true是否为非空。在以下示例中,筛选器的计算结果是订阅通知true是否包含包含10或的数组值的seats字段15。这意味着过滤器将评估订阅通知的seats字段值true是否为[10,11][15,20,30]

可能的值类型:整数、浮点数或字符串

{ "fieldName" : "seats", "operator" : "contains", "value" : [10, 15] }

AND 逻辑

通过在filterGroup数组中的filters对象内定义多个条目,可以使用 AND 逻辑组合多个过滤器。在以下示例中,筛选器的计算结果是订阅通知的userId字段的值true是否1等于,group字段值是否为AdminDeveloper

{ "filterGroup": [ { "filters" : [ { "fieldName" : "userId", "operator" : "eq", "value" : 1 }, { "fieldName" : "group", "operator" : "in", "value" : ["Admin", "Developer"] } ] } ] }

OR 逻辑

您可以通过在filterGroup数组中定义多个过滤器对象,使用 OR 逻辑组合多个过滤器。在以下示例中,筛选器的计算结果是订阅通知的userId字段的值等于1 OR 的group字段值true是否为AdminDeveloper

{ "filterGroup": [ { "filters" : [ { "fieldName" : "userId", "operator" : "eq", "value" : 1 } ] }, { "filters" : [ { "fieldName" : "group", "operator" : "in", "value" : ["Admin", "Developer"] } ] } ] }

异常

请注意,使用过滤器有几个限制:

  • filters对象中,每个过滤器最多可以有五个唯一fieldName项目。这意味着您可以使用 AND 逻辑组合最多五个单独的fieldName对象。

  • containsAny运算符最多可以有二十个值。

  • innotIn运算符最多可以有五个值。

  • 每个字符串最大长度为 256 个字符。

  • 每个字符串比较区分大小写。

  • 每个filterGroup最大长度为 10filters。这意味着filters使用 OR 逻辑最多可以合并 10 个。

    • in算符是 OR 逻辑的特殊情况。在以下示例中,有两个filters

      { "filterGroup": [ { "filters" : [ { "fieldName" : "userId", "operator" : "eq", "value" : 1 }, { "fieldName" : "group", "operator" : "in", "value" : ["Admin", "Developer"] } ] } ] }

      前面的过滤器组按如下方式进行评估,并计入最大过滤器限制:

      { "filterGroup": [ { "filters" : [ { "fieldName" : "userId", "operator" : "eq", "value" : 1 }, { "fieldName" : "group", "operator" : "eq", "value" : "Admin" } ] }, { "filters" : [ { "fieldName" : "userId", "operator" : "eq", "value" : 1 }, { "fieldName" : "group", "operator" : "eq", "value" : "Developer" } ] } ] }

$extensions.invalidateSinvalidationJsonObject

用于启动因突变而导致订阅失效。该参数invalidationJsonObject如下所述。

注意

此扩展只能在突变解析器的响应映射模板中使用。

在任何单个请求中,您最多只能使用五个唯一的$extensions.invalidateSubscriptions()方法调用。如果超过此限制,则您将收到 GraphQL 错误。

争论: invalidationJsonObject

invalidationJsonObject定义了以下内容:

  • subscriptionField— GraphQL 架构订阅将失效。在中定义为字符串的单个订阅被视为失效。subscriptionField

  • payload— 一个键值对列表,如果失效筛选器的计算结果是true针对订阅的值,则该列表用作使订阅失效的输入。

    以下示例在订阅解析器中定义的失效筛选器的计算结果与该payloadtrue相比时,使用订阅的已订阅和连接的客户端失效。onUserDelete

    $extensions.invalidateSubscriptions({ "subscriptionField": "onUserDelete", "payload": { "group": "Developer" "type" : "Full-Time" } })