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

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返回。

修复步骤

  1. 修改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并渲染
});
  1. 确保已安装ejs依赖,若未安装执行:
npm install ejs
# 或使用yarn
yarn add ejs
  1. 修复/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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 04:55:06