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

Express.js(EJS)视图查找失败:无法找到user_dashboard模板

Express 渲染EJS视图报错:Failed to lookup view "user/user_dashboard" in views directory "./views"

问题概述

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 17:05:15