Skip to content

WebSocket消息解析时未转义控制字符导致 JSON.parse 失败 #15

@qw-dmz

Description

@qw-dmz

环境:
@wecom/aibot-node-sdk v1.0.4
Node.js v24.14.0
Windows 10
问题描述:
企微服务端通过 WebSocket 推送的消息中, text.content 字段可能包含未转义的控制字符(如垂直制表符 \u000b / \x0b 、零宽字符 \u200c 等)。当前 index.cjs.js 和 index.esm.js 中的 this.ws.on('message', ...) 处理函数直接调用 JSON.parse(raw) ,遇到这些字符时会抛出:
Bad control character in string literal in JSON at position 454
复现方式:
用户在企业微信客户端输入含有特殊字符的文本(如复制粘贴含垂直制表符的内容),服务端推送的 WebSocket frame 中该字符未被转义,导致 SDK 解析失败。
修复方案:
在 JSON.parse(raw) 前增加控制字符清洗:

const sanitized = raw.replace(
  /[\x00-\x08\x0b\x0c\x0e-\x1f\u200b-\u200f\u2028\u2029\u202a-\u202e\u2060-\u206f\ufeff\ufff9-\ufffb]/g,
  (ch) => '\\u' + ch.charCodeAt(0).toString(16).padStart(4, '0')
);
const frame = JSON.parse(sanitized);

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions