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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 13:21:18