lyswhut / lx-music-mobile

一个基于 React native 开发的音乐软件
https://lyswhut.github.io/lx-music-doc/
Apache License 2.0
9.74k stars 1.31k forks source link

[Bug]: 播放歌曲时报错SyntaxError: JSON Parse error: Unexpected character,各个音源均出现 #531

Closed VictorSu000 closed 1 week ago

VictorSu000 commented 1 week ago

解决方案检查

预期行为

无报错

实际行为

播放一首新的歌曲时报错:SyntaxError: JSON Parse error: Unexpected character: o, js engine: hermes

具体出现在 src\utils\nativeModules\userApi.ts onScriptAction 函数,if (event.data) event.data = JSON.parse(event.data as string) 处。在这个代码前打印event,先后出现了以下log。

{"action": "response", "data": "{\"requestKey\":\"request__9771679874510859\",\"status\":false,\"errorMessage\":\"Fail\"}"}
{"action": "response", "data": {"errorMessage": "Fail", "requestKey": "request__9771679874510859", "status": false}}
ERROR  SyntaxError: JSON Parse error: Unexpected character: o, js engine: hermes

{"action": "request", "data": "{\"requestKey\":\"0.03702192998451315\",\"url\":\"http://******\",\"options\":{\"method\":\"GET\",\"headers\":{\"User-Agent\":\"lx-music/mobile\",\"ver\":\"2.0.0\",\"source-ver\":\"1\",\"tag\":\"5b0a20223238323433353439222c0a20223132386b220a5d\"},\"binary\":false}}"}
{"action": "request", "data": {"options": {"binary": false, "headers": [Object], "method": "GET"}, "requestKey": "0.03702192998451315", "url": "http://*****"}}
 ERROR  SyntaxError: JSON Parse error: Unexpected character: o, js engine: hermes

JSON.parse 报错是因为 event.data 已经是object了并不是string。而且出现这个报错时,前一条event内容和这一条event很类似。

报错场景:

我针对个人特殊需求进行过部分功能的小修改,但应该没动过native modules消息传递这块。如果其他人没法复现的话那我就不管了。我自己补了一个判断,仅当event.data为字符串时才进行JSON.parse

Lx Music 版本

master分支

最后正常的版本

No response

操作系统版本

模拟器 Pixel_3a _API_34_extension_level_7_x86_64

附加信息

No response

lyswhut commented 1 week ago

理论上 data 永远为 string

https://github.com/lyswhut/lx-music-mobile/blob/c70311bfb305b7e2e107ff28a91caf9f2171b3a8/android/app/src/main/java/cn/toside/music/mobile/userApi/JsHandler.java#L41-L48

你这个问题我从来没遇到,若能从仓库克隆的代码重现,可以看看安卓 logcat 的日志输出

VictorSu000 commented 1 week ago

未能复现,可能是我自己的问题,但我搜自己的代码并没有任何对event的调用或处理,奇怪了……我先close吧,谢谢作者啦~