Express.js子文件夹路由配置:拆分路由后模板找不到问题求助
问题解决方向
核心原因
Express 的 res.render() 默认从你配置的根视图目录(一般是views/)开始查找模板文件,你的report.html实际在views/1537/prototype-4/下,直接写res.render("report")会让框架去views/report.html查找,导致找不到模板。
具体修复方案
方案1:指定完整相对路径
修改子路由里的res.render参数,使用相对于views根目录的完整路径:
router.get('/report/:reportId', function (req, res) { console.log("Hello world"); res.render("1537/prototype-4/report"); });
注意:不需要加.html后缀,Express会根据你配置的视图引擎自动补全(如果是直接渲染HTML文件,需要提前配置引擎,见下方说明)。
方案2:配置HTML视图引擎(如果未配置)
如果你的项目直接用HTML作为模板文件,需要在主应用文件里添加视图引擎配置,否则Express会默认寻找.ejs等格式的模板:
const express = require('express'); const path = require('path'); const app = express(); // 设置视图根目录 app.set('views', path.join(__dirname, 'views')); // 配置HTML渲染引擎(这里用ejs来解析HTML,也可以用其他引擎如express-handlebars) app.engine('html', require('ejs').renderFile); app.set('view engine', 'html');
方案3:给子路由设置视图前缀(可选优化)
如果该子路由下有多个模板,不想每次都写长路径,可以给子路由的router对象限定模板查找范围:
const express = require('express') const router = express.Router() const path = require('path'); // 现在可以直接写模板文件名,指定查找根为当前文件所在的views子目录 router.get('/report/:reportId', function (req, res) { console.log("Hello world"); res.render("report", { root: path.join(__dirname) }); }); module.exports = router
内容的提问来源于stack exchange,提问作者Tom Wicks
相关产品推荐
相关产品推荐

