共计 1820 个字符,预计需要花费 5 分钟才能阅读完成。
问题背景
在使用 claude code 处理文本数据时,开发者经常会遇到 unexpected token '<' 的语法错误。这种错误通常发生在以下场景:

- 处理用户输入的 HTML 片段时
- 解析包含特殊字符的 JSON 数据时
- 从外部 API 获取的响应包含未转义的 XML 标签时
这个错误会导致脚本突然终止,不仅影响开发效率,在生产环境中还可能引发服务中断。
原因分析
1. 语法解析层面
claude code 的解析器遇到未转义的 < 字符时,会误认为是标签的开始符号。这与 JavaScript 中的 JSX 解析行为类似,但 claude code 有自己更严格的语法规则。
2. 字符编码问题
当文本包含特殊字符时,如果编码格式不一致(如 UTF- 8 与 ASCII 混用),<字符可能被错误解析。特别是在 Windows 环境下,默认编码问题更为常见。
3. 环境配置差异
不同操作系统对特殊字符的处理方式不同。Linux/MacOS 默认使用 UTF-8,而 Windows 的 cmd/PowerShell 可能使用其他编码,导致相同的代码在不同平台表现不一致。
解决方案
方案 1:使用 JSON.stringify 进行字符转义
// Node.js 示例:安全处理包含特殊字符的字符串
function safeString(input) {
try {
// 先转为 JSON 字符串自动转义特殊字符
let escaped = JSON.stringify(input);
// 去掉首尾的引号
return escaped.slice(1, -1);
} catch (err) {console.error('转义失败:', err);
return ''; // 返回安全默认值
}
}
// 使用示例
const userInput = '<script>alert(1)</script>';
console.log(safeString(userInput));
// 输出:\u003cscript\u003ealert(1)\u003c/script\u003e
适用场景:处理已知的短文本输入,性能开销小,适合高频调用的场景。
方案 2:配置 LC_ALL 环境变量
Linux/MacOS:
export LC_ALL=en_US.UTF-8
Windows (PowerShell):
$env:LC_ALL = 'en_US.UTF-8'
Windows (CMD):
set LC_ALL=en_US.UTF-8
适用场景:解决系统级编码问题,特别是跨平台项目。需注意这会影响整个 shell 会话。
方案 3:实现输入过滤中间件
// 正则表达式过滤危险字符
const sanitizeInput = (input) => {const unsafePattern = /[<>"'&]/g;
return input.replace(unsafePattern, (match) => {return `\u${match.charCodeAt(0).toString(16).padStart(4, '0')}`;
});
};
// 单元测试用例
const assert = require('assert');
assert.strictEqual(sanitizeInput('<html>'),
'\u003chtml\u003e'
);
适用场景:需要处理大量用户输入的系统,如 Web 应用后端。虽然有一定性能开销,但安全性最高。
避坑指南
- 不要依赖客户端验证:
- 错误做法:只在浏览器端用 JavaScript 过滤
< -
正确方案:前后端都做验证,遵循 ” 防御性编程 ” 原则
-
避免字符串拼接 SQL/ 命令:
- 错误做法:
const cmd =echo ${userInput}“ -
正确方案:使用参数化查询或 child_process.spawn
-
注意日志记录的安全:
- 错误做法:直接记录原始错误信息到日志文件
- 正确方案:对日志内容进行脱敏处理
延伸思考
构建更健壮的防御体系可以从以下方面入手:
- 分层验证:
- 输入层:Content-Type 检查
- 业务层:数据类型校验
-
持久层:ORM 参数化
-
监控告警:
- 设置语法错误告警阈值
-
记录错误上下文便于排查
-
自动化测试:
- 边界值测试:
<,>,&等特殊字符 - 编码测试:不同字符集组合
测试用例
可复现的完整测试代码已上传 GitHub:
claude-code-syntax-error-demo
包含:
– 三种解决方案的基准测试
– 各平台环境配置脚本
– 错误重现和修复示例
通过系统性地应用这些方案,可以有效预防和解决 unexpected token '<' 错误,使你的 claude code 应用更加稳定可靠。
