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

如何在ExpressJS向Pug模板传递含HTML标签的字符串并生效?

解决Express+Pug中HTML标签不生效的问题

这个问题我碰到过不少次,核心原因是Pug的默认插值语法#{...}会自动转义HTML内容,把<br/>这类标签变成实体字符(比如&lt;br/&gt;),所以浏览器只会把它当作普通文本显示。下面是最优的解决方案,分两种场景处理:

1. 内容完全可信(比如自己维护的数据库内容)

直接使用Pug的不转义插值语法!{...}代替#{...},它会保留原始的HTML标签,让浏览器正常解析。

修改你的Pug代码:

p | !{obj.text}

这样你的<br/>标签就会被浏览器识别为换行,而不是普通文本了。

2. 内容不可信(比如用户提交的内容)

如果文本来自用户输入或者其他不可控来源,直接用!{...}会有XSS攻击风险。这时候我们需要先过滤掉不安全的HTML标签,再进行插值。

步骤1:安装HTML过滤库

使用sanitize-html库来清理不安全的内容:

npm install sanitize-html

步骤2:在Express中处理文本

在路由里先过滤数据库获取的内容,只保留你允许的HTML标签:

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

app.get('/', (req, res) => { 
  // 假设dbText是从数据库取出的原始文本
  const dbText = 'some text <br/> more text <script>alert("恶意脚本")</script>';
  
  // 过滤不安全标签,只保留你需要的(比如br、p、em等)
  const safeText = sanitizeHtml(dbText, {
    allowedTags: ['br', 'p', 'em', 'strong'], // 允许的标签列表
    allowedAttributes: {} // 不允许任何属性,按需添加
  });

  res.render('index', { text: safeText }); 
});

步骤3:Pug中使用不转义插值

同样用!{...}来渲染过滤后的安全文本:

p | !{text}

这样既实现了HTML标签的正常解析,又避免了XSS攻击的风险,是更安全的生产环境方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:12:22