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

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;

我已反复确认视图文件存在且路径正确,但仍出现该错误,请问我忽略了什么?


解决方法

问题出在三个核心点:

  1. 控制器重复创建Express实例
    你在控制器里额外初始化了const app = express();,这完全多余。Express应用实例应该在server.js中统一创建配置,控制器只负责处理请求响应逻辑,无需重新初始化应用。这个新实例的视图配置和主应用无关,导致渲染时用了错误的路径。

  2. 主应用视图路径配置错误
    你的views目录实际在app/views下,但server.js在项目根目录,当前path.join(__dirname, 'views')指向的是根目录下的views(不存在),应该修改为:

    app.set('views', path.join(__dirname, 'app', 'views'));
    
  3. 清理控制器冗余代码
    删除控制器中所有无关的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 22:32:36