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

Express集成EJS报ERR_HTTP_HEADERS_SENT及标签渲染异常

问题根因

你的代码存在两处核心错误,直接触发报错和模板不渲染问题:

  • 重复发送响应:Express 中单次HTTP请求仅允许返回一次响应,res.send()、res.render() 这类方法执行后就会结束响应流程。你的代码在非周末分支会先执行res.send("work day")返回纯文本,但无论if/else逻辑走哪个分支,代码都会继续向下执行res.render(),相当于响应已经发送给客户端后,又尝试第二次返回内容,必然触发Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client错误。
  • 周末判断逻辑错误:你写的if (today.getDay() === 6 || 0)不符合JS语法逻辑,这行代码实际等价于判断今天是周六 或者 0,而0本身是假值,最终只有周六会进入if分支,周日(getDay()返回值为0)会被误判为工作日,和你预期的周六、周日都算周末的逻辑不符。
  • 冗余无效代码:const { send } = require('process')是自动补全带出的无用引入,完全可以删除。
修复方案

替换你的路由逻辑为以下代码,保证单次请求仅返回一次响应,同时修正日期判断:

const express = require('express')
const bodyparser = require("body-parser")
const app = express()
const port = 3000
app.set("view engine", "ejs")

app.get('/', (req, res) => {
    let today = new Date()
    let day = "";
    // 正确判断周日(0)和周六(6)
    if (today.getDay() === 0 || today.getDay() === 6) {
        day = "weekend"
    } else {
        day = "work day"
    }
    // 统一调用一次render,传入模板变量,不要额外调用send
    res.render("list", { kindOfDay: day })
})

app.listen(port, () => {
    console.log(`Example app listening at http://localhost:${port}`)
})
EJS原始标签输出排查

如果改完代码后浏览器仍然直接输出<%=kindOfDay%>原始字符串,检查以下配置:

  • 模板文件后缀必须是.ejs,即文件名为list.ejs,不能用.html后缀,后缀错误会导致EJS引擎不解析模板语法
  • 模板文件必须放在项目根目录的views文件夹下,这是Express默认的模板查找路径,如果你自定义了模板存放位置,需要通过app.set('views', '你的模板目录路径')额外配置
  • 不要用res.sendFile()直接返回ejs文件,必须通过res.render()调用EJS引擎渲染后再返回内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 20:57:19