Express - 无法查找视图

Posted

技术标签:

【中文标题】Express - 无法查找视图【英文标题】:Express - cannot lookup view 【发布时间】:2021-08-15 16:50:56 【问题描述】:

我咨询了许多其他类似的主题。我一直没能找到答案。

./
  config/
    connection.js
  controllers/
    homeRoutes.js
    index.js
  db/
    schema.db
  models/
    index.js
    User.js
  public/
    css/
      styles.css
  views/
    layouts/
      main.handlebars
  server.js

这是homeRoutes.js 的样子:

const router = require('express').Router();
const  User, BlogPost, Comment  = require('../models');


//TEST - render homepage
router.get('/test', async (req, res) => 
    try 
        res.render('main');
     catch (err) 
        res.status(500).json(err);
    
);

这是 server.js 所具有的(我认为问题出在此处):

// DEPENDENCIES
const express = require('express');
const sequelize = require('./config/connection');
const routes = require('./controllers');
const exphbs = require('express-handlebars');
const path = require('path');


// HANDLEBARS configuration
// set up Handlebars.js engine
const hbs = exphbs.create();

// EXPRESS CONFIGURATION
// tells node that we are creating an express server
const app = express();  

// sets an initial port.
const PORT = process.env.PORT || 9999;

// inform Express.js on which template engine to use
app.engine('handlebars', hbs.engine);
app.set('view engine', 'handlebars');

// Sets up express app to handle data parsing
app.use(express.urlencoded( extended: true ));
app.use(express.json());
app.use(express.static(path.join(__dirname, 'public')));
app.use(require('./controllers/homeRoutes'));


// tells app what routes to use
app.use(routes);

// Logging DB info
console.log(`Database name: $sequelize.config.database \n running on port: 
$sequelize.config.port \n under hostname: $sequelize.config.host`)


// Listener. Ths effectively 'starts' our server
app.listen(PORT, () => 
    console.log(`Node Server running on port: $PORT`);
)

当我运行服务器并转到我的路由 localhost:9999/test 时,我收到以下错误:

Error: Failed to lookup view "main" in views directory "/Users/ep9k/Desktop/Coding Bootcamp/Week14/ur-rich-fsf-pt-02-2021-u-c/Bootcamp14_TechBlog/views"
    at Function.render (/Users/ep9k/Desktop/Coding Bootcamp/Week14/ur-rich-fsf-pt-02-2021-u-c/Bootcamp14_TechBlog/node_modules/express/lib/application.js:580:17)
    at ServerResponse.render (/Users/ep9k/Desktop/Coding Bootcamp/Week14/ur-rich-fsf-pt-02-2021-u-c/Bootcamp14_TechBlog/node_modules/express/lib/response.js:1012:7)
    at /Users/ep9k/Desktop/Coding Bootcamp/Week14/ur-rich-fsf-pt-02-2021-u-c/Bootcamp14_TechBlog/controllers/homeRoutes.js:8:13
    at Layer.handle [as handle_request] (/Users/ep9k/Desktop/Coding Bootcamp/Week14/ur-rich-fsf-pt-02-2021-u-c/Bootcamp14_TechBlog/node_modules/express/lib/router/layer.js:95:5)
    at next (/Users/ep9k/Desktop/Coding Bootcamp/Week14/ur-rich-fsf-pt-02-2021-u-c/Bootcamp14_TechBlog/node_modules/express/lib/router/route.js:137:13)
    at Route.dispatch (/Users/ep9k/Desktop/Coding Bootcamp/Week14/ur-rich-fsf-pt-02-2021-u-c/Bootcamp14_TechBlog/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/Users/ep9k/Desktop/Coding Bootcamp/Week14/ur-rich-fsf-pt-02-2021-u-c/Bootcamp14_TechBlog/node_modules/express/lib/router/layer.js:95:5)
    at /Users/ep9k/Desktop/Coding Bootcamp/Week14/ur-rich-fsf-pt-02-2021-u-c/Bootcamp14_TechBlog/node_modules/express/lib/router/index.js:281:22
    at Function.process_params (/Users/ep9k/Desktop/Coding Bootcamp/Week14/ur-rich-fsf-pt-02-2021-u-c/Bootcamp14_TechBlog/node_modules/express/lib/router/index.js:335:12)
    at next (/Users/ep9k/Desktop/Coding Bootcamp/Week14/ur-rich-fsf-pt-02-2021-u-c/Bootcamp14_TechBlog/node_modules/express/lib/router/index.js:275:10)

如果我将main.handlebars 上移一级到views 目录,我会收到以下错误:

Error: ENOENT: no such file or directory, open '/Users/ep9k/Desktop/Coding Bootcamp/Week14/ur-rich-fsf-pt-02-2021-u-c/Bootcamp14_TechBlog/views/layouts/main.handlebars'

如果有帮助,这里是github repo:https://github.com/epurpur/Bootcamp14_TechBlog

【问题讨论】:

从错误来看,您似乎需要views/ 中的main.handlebars,这是您的控制器在执行res.render('main') 时引用的视图并且 您需要main.handlebarsviews/layouts/ 中,因为视图引擎正在那里寻找布局。 这些答案解决了你的问题吗? 【参考方案1】:

我认为您应该在这里查看reference。您忘记在views 文件夹中添加文件。在 homeRoutes.js 中,您将其称为 main我谦虚地认为这很令人困惑……在您的参考示例中 home)。因此,如果您创建此文件,则此代码将毫无问题地运行!

【讨论】:

以上是关于Express - 无法查找视图的主要内容,如果未能解决你的问题,请参考以下文章

节点无法在 Express/react 应用程序中查找视图“错误”

Nodejs / Express:错误:无法在视图目录中查找视图“错误”

无法读取未定义的属性“名称” - mongoose、express、nodeJS、ejs

node框架express里面静态文件中间件express.static,根据路径名查找文件

如何在node / express js中访问hbs引擎视图目录中文件夹内的文件

NodeJS框架Express的模板视图机制