Node.js+Express健身追踪应用:exercises.ejs视图渲染失败排查
我正在使用Node.js和Express.js开发一款健身追踪应用,尝试从views目录渲染exercises.ejs视图时出现以下错误:
Error: Failed to lookup view "exercises" in views directory "C:\Users\burak\Desktop\Fitness_Tracker\views"
我的应用目录结构如下:
├── app │ ├── Controllers │ ├── Routes │ └── views │ ├── index.ejs │ └── exercises.ejs ├── node_modules ├── package.json ├── package-lock.json └── server.js
服务端server.js代码如下:
import express from "express" import routes from '../app/Routes/index'; import ejs from 'ejs' import path from 'path' const app = express() const port = 3000 app.use(express.json()) app.use(express.urlencoded({ extended: true })) app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); app.engine('ejs', ejs.renderFile); app.use('/', routes); app.get('/', (req, res) => { res.render('index', { title: 'My Website', message: 'Welcome to my website!' }); }) app.listen(port, () => { console.log(`Example app listening on port ${port}`) })
我可以正常访问首页,但Exercise.js控制器文件无法找到views/exercises.ejs路径,控制器代码如下:
import db from '../../src/models/index' import express from "express" import path from 'path' import ejs from 'ejs' const app = express(); // app.set('views', path.join(__dirname, 'views')); // app.set('views', path.join(__dirname, '..', 'views')); app.set('views', path.join(__dirname, 'views')); class ExerciseController{ static async getAll(req, res) { try { const allExercises = await db.Exercises.findAll(); res.render('exercises', {exercises: allExercises}); } catch (error) { return res.status(500).send(error.message); } } static async addExercise(req, res) { try { const exercise = await db.Exercises.create(req.body); return res.status(201).json({ exercise, }); } catch (error) { return res.status(500).json({ error: error.message }); } } } export default ExerciseController;
我已反复确认视图文件存在且路径正确,但仍出现该错误,请问我忽略了什么?
问题出在三个核心点:
控制器重复创建Express实例
你在控制器里额外初始化了const app = express();,这完全多余。Express应用实例应该在server.js中统一创建配置,控制器只负责处理请求响应逻辑,无需重新初始化应用。这个新实例的视图配置和主应用无关,导致渲染时用了错误的路径。主应用视图路径配置错误
你的views目录实际在app/views下,但server.js在项目根目录,当前path.join(__dirname, 'views')指向的是根目录下的views(不存在),应该修改为:app.set('views', path.join(__dirname, 'app', 'views'));清理控制器冗余代码
删除控制器中所有无关的Express初始化、视图配置代码,包括:import express from "express" import path from 'path' import ejs from 'ejs' const app = express(); // app.set('views', path.join(__dirname, 'views')); // app.set('views', path.join(__dirname, '..', 'views')); app.set('views', path.join(__dirname, 'views'));控制器只需要保留业务逻辑,使用主应用传递的
req和res对象即可。
修正后重启服务,就能正常渲染exercises.ejs视图。
内容的提问来源于stack exchange,提问作者theplaceofburak

