You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用EJS渲染MongoDB中存储的Summernote HTML内容?

解决EJS中Summernote HTML内容转义不渲染的问题

这问题我碰到过好多次,核心原因其实很直白:EJS默认会自动转义HTML内容,所以你用<%= %>输出时,<h1>这类标签会被转成&lt;h1&gt;,自然没法被浏览器正常解析渲染。下面给你几个可行的解决办法,按优先级排序:

方法一:用EJS的非转义输出标签(最推荐)

直接把EJS模板里的<%= %>换成<%- %>标签就行——这个标签会跳过转义步骤,直接输出原始HTML内容。

假设你从MongoDB取出的Summernote内容存在article.content变量里,模板里这么写:

<div class="summernote-display">
  <%- article.content %>
</div>

页面渲染时,HTML标签就会被浏览器正确识别并展示格式了。

方法二:前端JS手动解码转义内容(备选)

如果因为某些限制没法修改后端EJS模板,只能在前端处理的话,可以写个简单的解码函数,把转义后的实体字符转回原始HTML。

先给容器加个ID:

<div id="summernote-target">
  <%= article.content %>
</div>

然后用JS解码并重新渲染:

// 解码HTML实体的工具函数
function decodeHtmlEntities(str) {
  const textarea = document.createElement('textarea');
  textarea.innerHTML = str;
  return textarea.value;
}

// 拿到转义后的内容,解码后插入容器
const escapedContent = document.getElementById('summernote-target').textContent;
document.getElementById('summernote-target').innerHTML = decodeHtmlEntities(escapedContent);

不过这种方法多了一层前端处理,效率不如方法一,而且复杂实体可能有解码遗漏,所以优先用方法一。

重要提醒:XSS安全风险

不管用哪种方法,都要注意XSS攻击风险——如果Summernote的内容是用户提交的,直接输出原始HTML可能会被注入恶意脚本。建议在后端存数据或输出前,用XSS过滤库(比如sanitize-html)处理一下,只保留安全的HTML标签和属性:

比如Node.js后端处理示例:

const sanitizeHtml = require('sanitize-html');

// 过滤不安全的HTML内容
const safeContent = sanitizeHtml(rawContent, {
  allowedTags: ['h1', 'h2', 'p', 'b', 'i', 'u', 'em', 'strong', 'a'],
  allowedAttributes: {
    'a': ['href', 'target'],
    'b': ['style']
  }
});

// 将safeContent传给EJS模板使用

这样既能正常渲染Summernote的格式,又能保证页面安全。

内容的提问来源于stack exchange,提问作者Kamoukou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:40:44