Express.js Router下载EJS文件而非渲染的问题求助
Express.js 下载EJS文件而非渲染的问题解决
我正在用纯Node.js开发类Zoom的实时视频共享功能,未借助额外框架。开发中遇到问题:Express.js会直接下载room.ejs文件,而非渲染它。
我要构建的是类Zoom的房间结构:生成随机字符串作为房间ID发送到服务端创建私人房间,持有相同ID的用户可加入。这是我第一个Express.js项目,我还是新手。
相关代码片段
模态框交互JS(最初用于创建/加入房间)
$(document).ready(function() { $('#createPartyBtn').click(function () { $('#createJoinRoomModal').modal('show'); }); $('#createRoomBtn').click(function () { window.location.href = '/create-room'; }); $('#joinRoomBtn').click(function () { window.location.href = '/join-room'; }); });
Home.js 文件
$(document).ready(function() { $('#createPartyBtn').click(function() { $('#createJoinRoomModal').modal('show'); $('#modalOverlay').show(); }); $('#createJoinRoomModal').on('hidden.bs.modal', function () { $('#modalOverlay').hide(); }); function generateRoomID() { return Math.random().toString(36).substr(2, 9); } $('#createRoomBtn').click(function() { var roomID = generateRoomID(); window.location.href = '/room/' + roomID; }); $('#joinRoomBtn').click(function() { var roomID = prompt('Enter Room ID:'); if (roomID) { window.location.href = '/room/' + roomID; } }); });
server.js 文件
const express = require("express"); const app = express(); const http = require("http").Server(app); const path = require("path"); const io = require("socket.io")(http); app.use(express.static("public")); app.set("view engine", "ejs"); app.set("views", path.join(__dirname, "/src")); app.get("/", (req, res) => { res.render("home"); }); app.get("/create-room", (req, res) => { const roomId = uuidv4(); // 生成随机房间ID res.render("create-room", { roomId }); }); app.get("/join-room", (req, res) => { res.render("join-room"); }); app.post("/join", (req, res) => { const roomId = req.body.roomId; res.redirect(`/room/${roomId}`); }); app.get("/room/:roomId", (req, res) => { const roomId = req.params.roomId; res.sendFile(__dirname + "/src/room.ejs"); });
文件目录结构
- Node_modules - public(包含CSS和JS文件) - src |- home.ejs |- room.ejs 以及其他EJS文件 - git - yarn.lock - package.json - server.js
已尝试的方法
我试过把Room.ejs重命名为Room.html,但这样无法使用Socket.io,还会报错,外部文件也无法正确链接。
问题根源
/room/:roomId路由中使用了res.sendFile()方法,该方法会直接将文件原封不动发送给客户端,不会经过EJS引擎渲染。而其他路由(如/、/create-room)使用的res.render()才会调用EJS引擎解析模板并生成HTML返回。
修复步骤
- 修改
server.js中的/room/:roomId路由,替换res.sendFile()为res.render():
app.get("/room/:roomId", (req, res) => { const roomId = req.params.roomId; res.render("room", { roomId }); // 自动到src目录查找room.ejs并渲染 });
- 确保已安装
ejs依赖,若未安装执行:
npm install ejs # 或使用yarn yarn add ejs
- 修复
/create-room路由中的uuidv4()报错:先安装uuid依赖,再引入模块:
npm install uuid # 或使用yarn yarn add uuid
在server.js顶部添加:
const { v4: uuidv4 } = require('uuid');
额外说明
res.render()会根据设置的view engine和views目录,自动定位并渲染模板,无需写完整文件路径。- 不要随意将EJS改为HTML,EJS支持模板语法(变量插入、循环等),能动态注入数据;而HTML是静态文件,不仅无法实现动态内容,还会导致Socket.io集成问题(Socket.io客户端脚本通常需要在模板中引入,EJS可轻松完成)。
内容的提问来源于stack exchange,提问作者Titan
相关产品推荐
相关产品推荐

