Skip to main content
 首页 » 编程设计

ruby-on-rails中尝试反序列化参数时 Shopify API 出错

2025年05月04日59youxin

今天早上,由于某些 Shopify 作业找不到模型 (products_update_job),我的应用开始崩溃(尝试反序列化参数时出错)。

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

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

请您参考如下方法:

经过大量挖掘和一点运气后,我注意到 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