lyswhut / lx-music-mobile

一个基于 React native 开发的音乐软件

Home Page:https://lyswhut.github.io/lx-music-doc/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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

VictorSu000 opened this issue · comments

解决方案检查

预期行为

无报错

实际行为

播放一首新的歌曲时报错: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很类似。

报错场景:

  • 编译后的apk在bluestacks模拟器安装后,首次运行时发生
  • npm run dev过程中,多次按 a 加载apk时可能触发,按 r 进行reload可能报错又会消失,没有找到稳定复现途径。但一旦该报错出现后,每播放一首歌曲都会稳定报错

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

Lx Music 版本

master分支

最后正常的版本

No response

操作系统版本

模拟器 Pixel_3a _API_34_extension_level_7_x86_64

附加信息

No response

理论上 data 永远为 string

private void sendActionEvent(String action, String data) {
WritableMap params = Arguments.createMap();
params.putString("action", action);
params.putString("data", data);
UtilsEvent utilsEvent = this.utilsEvent;
Objects.requireNonNull(utilsEvent);
utilsEvent.sendEvent("api-action", params);
}

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

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