如何确保 WebSocket 消息是 JSON 字符串,防止 JSON.parse 错误?



我已经四处寻找合适的方法来捕获或防止无效的JSON.parse调用,特别是在WebSocket消息的情况下,由于其性能影响而不涉及type/catch块。

我几乎完全将我的 RESTful API 迁移到使用 JSON 进行通信的纯 WebSocket API。唯一的问题是,当格式不正确的消息字符串通过我的onmessage函数时,我无法弄清楚如何防止 JSON.parse 停止应用程序。服务器发送的所有消息理论上都是经过字符串处理的正确JSON,所以问题也是,这是一个需要担心的边缘情况吗?由于用于从服务器端 JSON 发送数据的函数在发送之前会字符串化。

我正在使用ReactReduxredux-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导致服务器崩溃,那真的很糟糕。

最新更新