Fastify始终返回纯文本而非HTML,求助排查问题
问题原因及解决方案
核心问题
你遇到的情况是因为 fs.readFileSync 在未指定编码时返回的是Buffer 对象,部分 Node.js Web 框架在处理 Buffer 响应时,可能会自动将其转换为字符串并触发 HTML 转义逻辑;也有可能你的代码中存在其他环节意外对内容进行了转义。
解决方案
方案1:读取文件时指定编码,直接获取原始 HTML 字符串
修改 fs.readFileSync 调用,添加 utf8 编码参数,确保读取到的是未经处理的 HTML 字符串而非 Buffer:
import fs from 'fs' import path from 'path' ... // 添加 'utf8' 编码参数,直接获取字符串 const file = fs.readFileSync(path.join('/path/to/folder', 'index.html'), 'utf8') reply.headers({ 'content-type': 'text/html; charset=utf-8' }).send(file)
方案2:直接发送原始 Buffer,避免字符串转换环节
如果坚持使用 Buffer,可直接发送二进制内容,跳过可能触发转义的字符串转换步骤:
import fs from 'fs' import path from 'path' ... const file = fs.readFileSync(path.join('/path/to/folder', 'index.html')) // 明确指定内容类型后直接发送 Buffer reply.type('text/html; charset=utf-8').send(file)
方案3:检查框架全局转义配置
如果上述方法无效,检查你使用的 Web 框架是否开启了全局 HTML 转义功能:
- 例如 Fastify 中若意外开启了针对 text/html 的转义(默认不会),可在路由级别禁用:
app.get('/', { escapeHtml: false }, (request, reply) => { // ...你的业务代码 }) - 若使用 Express,检查是否引入了
express-escape-html这类转义中间件,如有则移除或针对性跳过当前路由。
快速验证方法
先在控制台打印读取到的内容,确认问题源头:
const file = fs.readFileSync(path.join('/path/to/folder', 'index.html'), 'utf8') console.log(file)
如果控制台输出正常 HTML 代码,说明问题出在框架的响应处理环节;如果控制台已显示转义后的代码,那需要检查你的 index.html 源文件本身是否已被转义。
内容的提问来源于stack exchange,提问作者user4893295
相关产品推荐
相关产品推荐

