Express.js(EJS)视图查找失败:无法找到user_dashboard模板
问题概述
使用Node.js和Express开发Web应用,已配置用户仪表盘的路由与控制器,但访问http://localhost:3000/user/dashboard时持续报错:
Failed to lookup view "user/user_dashboard" in views directory "./views"
已验证文件路径正确、程序能进入控制器,尝试过使用完整路径、添加.ejs后缀等操作,问题仍未解决,期望正常渲染user_dashboard.ejs页面。
项目结构
src/ ├── controllers/ │ └── user.js ├── views/ │ └── user/ │ └── user_dashboard.ejs ├── routes/ │ └── user.js ├── app.js └── server.js
关键代码
app.js
const express = require('express'); const app = express(); app.set('view engine', 'ejs'); // 设置视图目录 app.set('views', './views'); // JSON中间件 app.use(express.json()); // 使用路由 const userRoutes = require('./routes/user.js'); app.use('/user', userRoutes); // 将用户相关路由挂载到/user路径 module.exports = app; // 导出应用配置
server.js
const app = require('./app.js'); // 从app.js导入应用配置 const port = 3000; // 启动服务器 app.listen(port, () => { console.log(`Server is running on http://localhost:${port}`); });
routes/user.js
// src/routes/user.js const express = require('express'); const router = express.Router(); const userController = require('../controllers/user.js'); // 用户相关路由 router.get('/dashboard', userController.getDashboard); // URL: /user/dashboard module.exports = router;
controllers/user.js
exports.getDashboard = (req, res) => { const userData = {}; // 后续将从数据库获取用户仪表盘数据 res.render('user/user_dashboard', { user: userData }); //console.log('User dashboard data sent'); };
user_dashboard.ejs
<!DOCTYPE html> <html> <h1>Welcome to your Dashboard, username</h1> <p>Navbar with stuff</p> <p>Profile info</p> <p>Your borrowed items:</p> <ul> <li>items borrowed</li> </ul> </html>
解决方案
核心问题是视图目录的相对路径是基于启动服务器时的工作目录,而非app.js所在的目录。如果你的启动命令是在项目根目录执行(比如node src/server.js),那么./views会指向项目根目录下的views文件夹,但你的视图文件实际在src/views中,导致路径匹配失败。
推荐方案:使用绝对路径设置视图目录
借助Node.js的path模块拼接绝对路径,确保无论从哪个目录启动服务器,都能正确找到视图文件夹:
修改app.js中的视图目录配置:
const express = require('express'); const path = require('path'); // 引入path模块 const app = express(); app.set('view engine', 'ejs'); // 使用绝对路径设置视图目录 app.set('views', path.join(__dirname, 'views')); // JSON中间件 app.use(express.json()); // 其余代码不变...
__dirname代表当前文件(app.js)所在的目录,path.join(__dirname, 'views')会生成src/views的绝对路径,彻底避免相对路径的歧义。
可选方案:切换工作目录后启动服务器
如果不想修改代码,可以在启动服务器前先进入src目录:
cd src && node server.js
这种方法能让./views指向src/views,但不如绝对路径可靠,容易因启动目录变化再次出现问题。
验证方法
可以在app.js中添加日志,确认视图目录的实际路径:
console.log('当前视图目录:', app.get('views'));
启动服务器后,查看输出的路径是否与src/views的绝对路径一致,以此验证配置是否生效。
内容的提问来源于stack exchange,提问作者sam

