我正在使用AWS AppSync开发一个消息应用程序。
我有以下消息类型。。。
type Message
@model
@auth(
rules: [
{ allow: groups, groups: ["externalUser"], operations: [] }
]
) {
id: ID!
channelId: ID!
senderId: ID!
channel: Channel @connection(fields: ["channelId"])
createdAt: AWSDateTime!
text: String
}
我订阅了Createmessage。我需要将结果筛选到用户所在的频道。因此,我从权限表中获得频道列表,并将以下内容添加到我的响应映射模板中。
$extensions.setSubscriptionFilter({
"filterGroup": [
{
"filters" : [
{
"fieldName" : "channelId",
"operator" : "in",
"value" : $context.result.channelIds
}
]
}
]
})
$util.toJson($messageResult)
而且效果很好。但是,如果一个用户在5个以上的频道,我会得到以下错误。
{
"message": "Connection failed: {"errors":[{"message":"subscription exceeds maximum value limit 5 for operator `in`.","errorCode":400}]}"
}
我是vtl的新手。所以我的问题是,我如何将过滤器分解为多个或多个过滤器?
根据创建增强订阅过滤器,"使用AND逻辑评估滤波器中的多个规则,而使用OR逻辑评估滤波器组中的多条滤波器。
因此,据我所知,您只需要将$context.result.channelIds
拆分为5组,并为每组向filters
数组添加一个对象。
下面是一个VTL模板,它将为您做到这一点:
#set($filters = [])
#foreach($channelId in $context.result.channelIds)
#set($group = $foreach.index / 5)
#if($filters.size() < $group + 1)
$util.qr($filters.add({
"fieldName" : "channelId",
"operator" : "in",
"value" : []
}
))
#end
$util.qr($filters.get($group).value.add($channelId))
#end
$extensions.setSubscriptionFilter({
"filterGroup": [
{
"filters" : $filters
}
]
})
您可以在此处看到此模板正在运行:https://mappingtool.dev/app/appsync/042769cd78b0e928db31212f5ee6aa17
(注意:第15行的映射工具错误是$filters数组被动态填充的结果。您可以安全地忽略它们。(
是否要为GraphQL订阅添加服务器端筛选器?如果是这样,现在,订阅服务器端过滤器支持Amplify。在你查看了下面的博客之后,你可能会感觉到它。https://aws.amazon.com/blogs/mobile/announcing-server-side-filters-for-real-time-graphql-subscriptions-with-aws-amplify/