尝试反序列化参数时出现Shopify API错误

时间:2018-06-18 17:32:01

标签: ruby-on-rails activerecord ruby-on-rails-5 shopify rails-activejob

今天早上我的应用程序开始崩溃(Error while trying to deserialize arguments),原因是一些无法找到模型的Shopify作业(products_update_job)。

经过进一步调查后,我发现我在这些工作中编写的代码甚至没有尝试搜索模型,只是删除了一些Memcached标签。

我一直在使用shopify_app gem来设置webhook并处理它们。

2 个答案:

答案 0 :(得分:2)

经过大量挖掘和一点运气后,我注意到Shopify的webhooks响应中包含一个新字段admin_graphql_api_id: gid://shopify/Product/817915723823。然后我开始进行更多挖掘和学习Global ID,以发现“支持自动包含在Active Record中。”

所以发生的事情是Shopify在一夜之间开始发送自动触发模型搜索的admin_graphql_api_id字段,弄乱我的应用程序。

修复是添加一个绕过模型搜索的初始化程序,什么都不做。

我可以使用此功能自动查找模型,但有时应用会收到不再存在的产品的webhook。

config/initializers/global_id.rb

GlobalID::Locator.use :shopify do |gid|
  # do nothing
end

<强>更新

一个快速解决方法是过滤掉那个参数

def deserialize(job_data)
  sanitized_data = recursive_delete_gids(job_data)
  super(sanitized_data)
end

private

def recursive_delete_gids(hash)
  hash.each do |key, value|
    case value
  when String
    hash.delete(key) if value.start_with? 'gid://'
  when Hash
    recursive_delete_gids(value)
  when Array
    value.each do |array_value|
      recursive_delete_gids(array_value) if array_value.is_a? Hash
    end
  end
end

答案 1 :(得分:0)

昨天,从美国东部时间上午10点到下午6点左右,我几乎遇到了同样的问题。我的应用程序通过webhook接收订单有效负载,并将它们排入队列以使用delay_jobs进行处理。我收到的错误:

E,[2018-06-18T22:25:43.927114#51]错误-:2018-06-18T22:25:43 + 0000:[Worker(host:e069195b1b97 pid:51)] Job ActiveJob :: QueueAdapters :: DelayedJobAdapter :: JobWrapper(id = 15571)(queue = webhook)与ActiveJob :: DeserializationError失败(4次尝试):尝试反序列化参数时出错:未初始化的常量Order

我认为这是由此属性引起的,显然不再发送了:

admin_graphql_api_id:gid:// shopify / Order / 516 .......

我要更改我的应用程序以将有效负载写到新表中,并且仅将有效负载记录的ID序列化为delay_jobs。