今天早上,由于某些 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