2019-1-4 微信 wx.chooseImage 图片顺序问题(其实并没有问题)

是我用错了 Ruby on Rails 的 find_or_create_by (因为七牛回调的顺序不一致)

2019-1-4 微信 wx.chooseImage 图片顺序问题(其实并没有问题)

一句话总结

本文讲的是一次 bug 跟踪,bug 是用户反馈说在小程序里选择图片的顺序和发完图片后显示的顺序不一致。
一开始怀疑是 wx.chooseImage 可能有问题。返回的顺序错误。也许是因为我用了 sizeType compressed。
后来追踪问题发现是错误的使用了 Ruby on Rails 的 find_or_create_by。

本文以上这一句话就可以总结了,如果你对细节感兴趣可以继续阅读。


0. 前提

我们的微信小程序类似 Instagram,用户可以选1到4张图片。
加一段字,然后发出去。

1. 问题

有用户说图片顺序错了。和他选图片的顺序不一致。
实测可以复现

2. 修复的过程

一开始怀疑是微信 chooseImage 的锅
谷歌搜索 "wx.chooseImage 图片顺序" 只有几个相关结果。
都是微信开发者社区里的帖子,其中2个问题完全没人回复。
另一个问题有官方回复(时间:2018-6-15) https://developers.weixin.qq.com/community/develop/doc/000a4881b80468b19de649f0551400

你好,经确认,这个确实是bug,我们会在这个月修复好,感谢大家的反馈

因为现在是2019年1月了,这个回复是2018年6月,那么我就假设"可能修好了"。不管怎样还是要测一测。

这个顺序错误问题有几种可能:

  1. (小程序) 微信小程序 wx.chooseImage 返回的顺序是错的 (微信的锅)
  2. (小程序) 提交给服务器时顺序错了 (我们的锅)
  3. (后端) 服务器存的时候存错了 (我们的锅)
  4. (后端) 服务器返回数据的时候顺序错了 (我们的锅)

最后发现是3的问题。
3的问题是 find_or_create_by 导致的
所以解决办法是 find_or_create_by 之后更新 created_at 和 updated_at 即可。

具体展开第3点讲讲

我们用了七牛,七牛在上传成功后会回调我们服务器。
此时我们存了数据下来。用户发文的时候我们用 Image.find_or_create_by 把之前的图片找到。
(我们有个 Model 叫 Image)
此前纯粹是 Image.create 就没有顺序问题。后来改成了 Image.find_or_create_by
又没注意回调的顺序肯定是不一样的,造成了问题。

解决办法是 find_or_create_by 之后更新 created_at 和 updated_at 即可。

全文完

感谢阅读