EJS传服务端对象到客户端时引号转义致JSON.parse报错如何解决
问题根因
EJS 模板的 <%= %> 输出语法默认会对内容做HTML实体转义,你代码中用<%= JSON.stringify(data) %>输出时,字符串里的双引号"会被自动转义为",直接破坏JSON格式,导致JSON.parse执行报错。
解决方法
根据你的数据可信程度,二选一即可:
- 方案1:使用非转义输出语法(适合可信数据场景)
EJS 提供了不对内容做转义的输出标记<%- %>,直接替换原有转义输出标记即可,同时修正多余的引号语法问题:
<script type='text/javascript'> <% if (typeof data !== 'undefined' && data) { %> // 无需额外包裹单引号,JSON.stringify输出本身就是合法JS字面量 const data = <%- JSON.stringify(data) %>; <% } %> </script>
注意:该方法直接输出原始内容,仅适用于
data为服务端可控的可信数据场景,若data包含用户提交的未过滤内容,会存在XSS注入风险。
- 方案2:客户端反转义后解析(适合不可信数据场景)
如果data包含用户可控的不可信内容,保留<%= %>的转义逻辑做XSS防护,在客户端先解码HTML实体再解析JSON即可:
<script type='text/javascript'> <% if (typeof data !== 'undefined' && data) { %> const escapedStr = '<%= JSON.stringify(data) %>'; // 通用HTML实体解码方法 const decodeEntities = (str) => { const dom = document.createElement('textarea'); dom.innerHTML = str; return dom.value; }; const data = JSON.parse(decodeEntities(escapedStr)); <% } %> </script>
避坑提示
不要给JSON.stringify的输出结果额外包裹单引号,JSON.stringify序列化后的内容本身就是符合JavaScript语法规则的值,可直接赋值给变量,多余的引号反而会触发语法错误。
内容的提问来源于stack exchange,提问作者Xiang Li
相关产品推荐
相关产品推荐

