如何无需为每个文件创建路由即可渲染Express.js中的.ejs文件?
实现Express自动渲染EJS页面(无需重复编写路由)
你可以通过动态路由配合文件存在性检查来实现自动匹配并渲染EJS页面,不用为每个页面单独写路由。
1. 修改服务器代码
添加一个通配符路由捕获所有页面请求,同时检查对应的EJS文件是否存在,避免渲染不存在的页面报错:
import express from 'express'; import fs from 'fs/promises'; import path from 'path'; const app = express(); // 设置模板引擎为EJS(原代码缺失该配置,必须添加,否则render时需写完整文件名) app.set('view engine', 'ejs'); app.set('views', './public'); const PORT = 3002; // 根路由 app.get('/', (req, res) => { res.render('index', { title: 'Page Title'}); }); // 动态匹配所有页面路由 app.get('/:page', async (req, res) => { const pageName = req.params.page; // 拼接EJS文件路径 const filePath = path.join(process.cwd(), 'public', `${pageName}.ejs`); try { // 检查文件是否存在 await fs.access(filePath); // 渲染对应EJS页面,可传递通用参数 res.render(pageName, { title: `${pageName} Page` }); } catch (err) { // 文件不存在时返回404 res.status(404).send('Page not found'); } }); app.listen(PORT, () => { console.log(`Server is running at http://localhost:${PORT}`); });
2. 在index.ejs中添加页面链接
使用不带.ejs后缀的路径作为链接,更符合URL规范:
<!DOCTYPE html> <html> <head> <title><%= title %></title> </head> <body> <h1><%= title %></h1> <!-- 指向page2页面的链接 --> <a href="/page2">前往Page2</a> <!-- 新增页面直接添加对应链接即可 --> <a href="/page3">前往Page3</a> </body> </html>
注意事项
- 确保
./public目录下存在page2.ejs、page3.ejs等对应的模板文件; - 若要支持带
.ejs后缀的URL,可将动态路由改为/:page.ejs,同时渲染时去掉文件名的.ejs后缀; - 页面通用参数(如标题)可在动态路由中统一传递,无需每个页面单独处理。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

