【问题标题】:Render raw html in response with Express使用 Express 渲染原始 html
【发布时间】:2025-12-10 09:20:04
【问题描述】:

我想知道如何在 Express 的响应中呈现原始 HTML 字符串。

我的问题与其他问题不同,因为我不想渲染原始 HTML 模板;而我只想渲染一个原始的 HTML 字符串。

这是我在路由文件中尝试过的。

router.get('/myRoute', function (req, res, next) {
  var someHTML = "<a href=\"foo\">bar</a>"
  res.end(someHTML);
});

但是当我将浏览器指向这条路线时,我看到的是一个超链接,而不是原始的 HTML 字符串。我试图通过执行以下操作将内容类型设置为文本:res.setHeader('Content-Type', 'text'); 无济于事。

有什么建议吗?

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    对于到达这里的其他人;这对我最有效:

    res.set('Content-Type', 'text/html');
    res.send(Buffer.from('<h2>Test String</h2>'));
    

    编辑:

    如果您的问题是转义某些字符,请尝试使用模板文字:Template literals

    【讨论】:

    • 您也可以使用res.setHeader('Content-Type', 'text/html'),无需Buffer.from 调用即可正常工作
    【解决方案2】:

    只需在其周围添加标签

    someHTML = "<plaintext>" + someHTML + "</plaintext>";
    

    请注意,纯文本已被视为已过时,这意味着浏览器供应商没有义务实施它们。但是,它仍然适用于主流浏览器。

    另一种方法是

    someHTML = someHTML.replace(/</g, '&lt;').replace(/>/g, '&gt;');
    

    【讨论】:

    • 在第二种解决方案中,&amp;lt;&amp;gt; 按字面意思打印在浏览器上,而不是对应的符号 &lt;&gt;。我该如何继续?
    • “第二种解决方案”是我有史以来最糟糕的编码反模式之一。本质上它是一个可怜的 mans html 转义器,因为它只转义了 2 个 html 符号。如果你发现自己在做这样的事情,你可能做错了。
    【解决方案3】:

    最好的方法是,假设您使用回调样式,声明 var output=""....然后使用 +=.... 将您需要的内容附加到输出 var 中。文字 (new line doesn't matter ${variables in here}) 如果它是一个大字符串......然后 res.writeHead(200,{Content-Type: text/html); res.end(输出)

    【讨论】:

    • 谢谢布赖恩!我最终得到了 res.writeHead(200,"{Content-Type:text/html}"); res.end(输出);
    【解决方案4】:

    在发送之前对 HTML 进行编码。有人为此做了一个要点:https://gist.github.com/mikedeboer/1aa7cd2bbcb8e0abc16a

    【讨论】: