我已经四处寻找合适的方法来捕获或防止无效的JSON.parse
调用,特别是在WebSocket消息的情况下,由于其性能影响而不涉及type/catch
块。
我几乎完全将我的 RESTful API 迁移到使用 JSON 进行通信的纯 WebSocket API。唯一的问题是,当格式不正确的消息字符串通过我的onmessage
函数时,我无法弄清楚如何防止 JSON.parse 停止应用程序。从服务器发送的所有消息理论上都是经过字符串处理的正确JSON,所以问题也是,这是一个需要担心的边缘情况吗?由于用于从服务器端 JSON 发送数据的函数在发送之前会字符串化。
我正在使用React
和Redux
与redux-thunk
打开 WebSocket 并添加事件侦听器,因此在消息中正在运行下面的函数。
function onMessage(msg) {
const data = JSON.parse(msg.data);
return {
type: data.type,
data: data.data
}
}
但是,当然,如果msg不是有效的JSON字符串,则这会中断,然后停止应用程序的执行。
那么,如果没有try/catch
块,是(以某种方式(确保发送有效 JSON 的唯一选择吗?或者这是我不应该担心的边缘情况。
编辑
对于客户端来说,这可能不是一个大问题,因为所有消息都来自一个集中点(服务器(,尽管另一方面,对于服务器来说,这是一个相当大的问题,因为它可能会接收尚未从应用程序发送的消息。
try/catch
真的是魔鬼吗?因为我唯一能想到的就是创建一个正则表达式检查,这本身最终会变得非常复杂。
涉及
type/catch
块,因为它会影响性能。
忘记神话。你想捕获一个异常,比如来自JSON.parse
的异常,你使用try
/catch
块。就是这么简单,对性能没有太大影响。当然,你也可以编写自己的逻辑来验证JSON字符串(不是用正则表达式!(,但这将是一个完整的解析器,它只是不使用异常来信号格式错误的输入 - 并且比本机函数慢得多。
这是一个需要担心的边缘情况吗?
在客户端上,几乎没有。您正在控制服务器并确保仅发送有效的 JSON 字符串。如果你不这样做,我会更担心服务器而不是几个客户端崩溃。用户很可能会重新加载页面并继续。
虽然另一方面,对于服务器来说是一个相当大的问题,但看到它有可能接收尚未从应用程序发送的消息。
是的。在服务器上,您绝对需要担心格式错误的输入。如果发送无效的JSON导致服务器崩溃,那真的很糟糕。