【问题标题】:Applying filters on subscriptions对订阅应用过滤器
【发布时间】:2019-08-14 00:15:15
【问题描述】:

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

苦艾分辨率需要作为参数 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  ```

【问题讨论】:

  • 我猜你在问一个类似的问题:stackoverflow.com/questions/54894293/…?它基本上归结为使用主题调用来确保客户端只对过滤后的数据感兴趣,而不是其他所有内容
  • 我想不使用主题,因为你无法扩展它,你必须为每个主题创建一个频道
  • 我无法使用主题,因为我无法为每个可能的过滤器值创建主题/频道。

标签: elixir absinthe


【解决方案1】:

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

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

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

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

由于在问题的 cmets 中你说你不能为每个可能的值创建一个主题,我想你可以走 B 路。

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

【讨论】:

    猜你喜欢
    • 2020-03-03
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    相关资源
    最近更新 更多