首页 > 解决方案 > 对订阅应用过滤器

问题描述

我试图在订阅中应用过滤器,但在解析器文件中遇到了一些问题。

苦艾分辨率需要作为参数 a {:ok, params} o {:error,params } 所以它可以执行,问题是你发送的所有内容都出现在我的订阅中,我想停止执行所以什么都不会发送到我的订阅

这是我尝试过的


  def subscribe(item, args, %{context: %{current_token: _current_token}}) do
    filter_subscription(item, args)
  end

  def subscribe(_args, _info, _ctx) do
    {:error, "Not Authorized"}
  end

  def filter_subscription(item, %{filter: filter}) do
    IO.inspect item
    IO.inspect(filter)

    case filter do
       %{name: name}->
          case String.contains?(item.name, name) do
            true ->
                {:ok, item}
            false ->
                nil
          end
        _hey ->
          IO.puts "error"
    end
  end

end  ```

标签: elixirabsinthe

解决方案


通常,您可以通过以下两种方式之一确定发送的内容:

A)如果您只想将对象发送给某些订阅者 - 您使用主题作为中间步骤。您字段中的config函数确定订阅者正在收听的主题,并且在您发布时决定要发布到哪些主题(通过为每个相关主题调用 Absinthe.Subscription.publish 一次,或通过trigger订阅字段声明中的函数) . 发布到无主题当然是一种选择!

B)如果您只有一个主题供所有订阅者使用,但想根据其内容决定是否发送对象,您可以根据对象决定是否调用Absinthe.Subscription.publish,或者如果您正在使用trigger您的功能将决定是否返回主题名称或空列表[]

当您的解析器运行时,absinthe 已经决定将订阅结果发送给订阅者。你不能阻止它发送一些东西,你只能选择什么。我想如果你真的想在你的解析器中做某事,你可以返回{:ok, nil}以便你的订阅者获得一个null值并可以处理它,但这很奇怪。

由于在对问题的评论中你说你不能为每个可能的值创建一个主题,我想你可以选择路径 B。

(是的,我在这里从苦艾酒松弛频道重新发布我的回复!希望你看到它并觉得它有用!)


推荐阅读