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
相关产品推荐
相关产品推荐

