自作ライブラリを使ったBlueskyクライアントを実装していて遭遇したバグ。
ATriumからのfeed.getPostsでurisが21個までなら大丈夫だが22個以上だとエラーになることが発覚した。問題切り分け中… ここまで自作クライアント実装してようやく気付く問題があるんだから やっぱりドッグフーディング大事やな、、
— すぎゃーん (@sugyan.com) Apr 21, 2024 at 10:21 AM
問題の詳細と対応は以下の通り。
- `app.bsky.feed.getPosts` fails with more than a certain number of arguments `uris` · Issue #160 · sugyan/atrium · GitHub
- feat: Replace serde_qs to serde_html_form by sugyan · Pull Request #161 · sugyan/atrium · GitHub
Expressで使っている qs
が、[]
を含むキーのときに配列として扱おうとするが、そのindexの大きさによって結果がarrayではなくobjectになったりする、というもの。
その境界のdefault値が20
なので、順番にindexをつけているとuris[0]=...&urls[1]=...&uris[20]=...
という 21個までなら問題ないが 22個になると突然objectとして扱われるようになってしまう、と。
確かにindex指定したものを読んでくれるのは便利だが… そんな挙動があると知らずにrequestを送っているとハマる。
const qs = require("qs"); console.log(qs.parse("ids=foo&ids=bar")); console.log(qs.parse("ids[]=foo&ids[]=bar")); console.log(qs.parse("ids[0]=foo&ids[1]=bar")); console.log(qs.parse("ids[1]=foo&ids[0]=bar")); console.log(qs.parse("ids[20]=foo")); console.log(qs.parse("ids[21]=foo"));
{ ids: [ 'foo', 'bar' ] } { ids: [ 'foo', 'bar' ] } { ids: [ 'foo', 'bar' ] } { ids: [ 'bar', 'foo' ] } { ids: [ 'foo' ] } { ids: { '21': 'foo' } }
わりとみんなハマっているようで困っている人も多そうではあるが、とにかくそういう仕様なようなので express なserverにリクエストを送るときは気をつけるしかなさそう。