错误:无法在Express中查找视图

时间:2012-04-18 19:18:27

标签: node.js express pug

注意:我在帖子末尾的自动回答

我正在尝试更好地体验nodeJS,我真的不想将所有脚本放在一个文件中。

所以,按照这里的帖子我使用这个结构

./
 config/
   enviroment.js
   routes.js
 public/
   css/
     styles.css
   images
 views
   index
     index.jade
   section
     index.jade
   layout.jade
 app.js

我的文件现在是:

app.js

var express = require('express');
var app = module.exports = express.createServer();

require('./config/enviroment.js')(app, express);
require('./config/routes.js')(app);

app.listen(3000);

enviroment.js

module.exports = function(app, express) {
    app.configure(function() {
        app.use(express.logger());
        app.use(express.static(__dirname + '/public'));
        app.set('views', __dirname + '/views');
        app.set('view engine', 'jade'); //extension of views

    });

    //development configuration
    app.configure('development', function() {
        app.use(express.errorHandler({
            dumpExceptions: true,
            showStack: true
        }));
    });

    //production configuration
    app.configure('production', function() {
        app.use(express.errorHandler());
    });

};

routes.js

module.exports = function(app) {

    app.get(['/','/index', '/inicio'], function(req, res) {
        res.render('index/index');
    });

    app.get('/test', function(req, res) {
        //res.render('index/index');
    });

};

layout.jade

!!! 5
html
    head
        link(rel='stylesheet', href='/css/style.css')
        title Express + Jade
    body
        #main
            h1 Content goes here
            #container!= body

索引/ index.jade

h1 algoa

我得到的错误是:

  

错误:无法查找视图“index / index”       在Function.render(c:\ xampp \ htdocs \ nodejs \ _bus \ node_modules \ express \ lib \ application.js:495:17)       在渲染(c:\ xampp \ htdocs \ nodejs \ _bus \ node_modules \ express \ lib \ response.js:614:9)       在ServerResponse.render(c:\ xampp \ htdocs \ nodejs \ _bus \ node_modules \ express \ lib \ response.js:638:5)       在c:\ xampp \ htdocs \ nodejs \ _bus \ config \ routes.js:4:7       在回调(c:\ xampp \ htdocs \ nodejs \ _bus \ node_modules \ express \ lib \ router \ index.js:177:11)       在param(c:\ xampp \ htdocs \ nodejs \ _bus \ node_modules \ express \ lib \ router \ index.js:151:11)       传递(c:\ xampp \ htdocs \ nodejs \ _bus \ node_modules \ express \ lib \ router \ index.js:158:5)       在Router._dispatch(c:\ xampp \ htdocs \ nodejs \ _bus \ node_modules \ express \ lib \ router \ index.js:185:4)       在Object.router [作为句柄](c:\ xampp \ htdocs \ nodejs \ _bus \ node_modules \ express \ lib \ router \ index.js:45:10)       在下一个(c:\ xampp \ htdocs \ nodejs \ _bus \ node_modules \ express \ node_modules \ connect \ lib \ proto.js:191:15)

但我真的不知道问题是什么......

我开始想的是因为模块导出......

答案: 我找到的独特解决方案是更改我定义的app.set('views')和视图引擎

的位置

我把它移到了app.js,现在效果很好。

var express = require('express');
var app = module.exports = express.createServer();


require('./config/enviroment.js')(app, express);

app.set('views', __dirname + '/views');
app.set('view engine', 'jade');

require('./config/routes.js')(app);

app.listen(3000);

我真的不明白这背后的逻辑,但我会说它有一个。

15 个答案:

答案 0 :(得分:33)

添加到@mihai的回答:

如果你在Windows中,那么只是连接__dirname' + '../public'会导致错误的目录名称(例如:c:\dev\app\module../public)。

而是使用path,无论操作系统如何都可以使用。

var path = require ('path');
app.use(express.static(path.join(__dirname + '.../public')));

path.join将规范化路径分隔符,并返回正确的路径值。

答案 1 :(得分:30)

如果有帮助,

npm install express@2.5.9会安装以前的版本。

我知道在3.x中删除了视图布局机制,但这可能不是你的问题。同时将express.createServer()替换为express()

更新

这是来自environment.js的__dirname 它应该是:

app.use(express.static(__dirname + '../public'));

答案 2 :(得分:5)

起初我有同样的错误,我真的很生气。 你只需要在模板路径之前有./

res.render('./index/index');

希望它有效,为我工作。

答案 3 :(得分:4)

通过在app.js文件中添加以下代码来解决该问题

app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');
app.set('views', __dirname);

app.get('/', function(req, res){
    res.render("index");
});

答案 4 :(得分:2)

检查您是否使用了正确的视图引擎。 在我的情况下,我更新了npm并最终将引擎更改为' hjs'(我试图卸载jade以使用pug)。 因此,将它从app.js文件中的hjs更改为jade对我来说很有用。

 app.set('view engine','jade'); 

答案 5 :(得分:1)

使用此代码解决问题

app.get('/', function(req, res){
    res.render("index");
});

答案 6 :(得分:1)

注意到我已将' index.html'的文件命名为'index.html',但前导空格为declare module "react-leaflet" { class MapLayer { ... } } 。这就是为什么找不到它。

答案 7 :(得分:1)

由于文件名区分大小写,因此基本上可以看到此问题。 例如,如果您将文件另存为index.jadge,而不是其路径上的鬃毛,则在Windows中应该为“ index”而不是“ Index”,但是可以,但是在像服务器这样的linux系统中,则会产生问题。

1)(如果文件名为 index.jadge

app.get('/', function(req, res){
      res.render("index");
});

2)(如果文件名为 Index.jadge

app.get('/', function(req, res){
      res.render("Index");
});

答案 8 :(得分:1)

对于我来说,我可以通过以下方法解决它:

app.set('views', `${__dirname}/views`);
app.use(express.static(`${__dirname}/public`));

我需要从node app.min.js文件夹中启动/dist

我的文件夹结构是:

Start app from /dist

答案 9 :(得分:0)

我将views文件夹名称更改为views_render,并且还面临与上面相同的问题,因此重新启动server.js并且它适用于我。

答案 10 :(得分:0)

这个错误实际上只与文件Path有关,那就是你需要检查的一切,对我来说,我的父文件夹是" Layouts"但我的实际文件是layout.html,我的路径都有布局,一旦我纠正错误消失了。

答案 11 :(得分:0)

我遇到了同样的问题,可以使用dougwilson的解决方案解决:2017年4月5日,Github

  1. 我将文件名从index.js更改为index.pug
  2. 然后在'/'路由中使用:res.render('index.pug')-代替res.render('index')
  3. 设置环境变量:DEBUG=express:view 现在它就像一种魅力。

答案 12 :(得分:0)

您可以将路径设置为这样的常量,然后使用express进行设置。

const viewsPath = path.join(__dirname, '../views') 
app.set('view engine','hbs')

 app.set('views', viewsPath)

 app.get('/', function(req, res){

 res.render("index");

});

这对我有用

答案 13 :(得分:0)

我在Linux上也遇到了这个问题

I had the following

  res.render('./views/index')

I changed it too
  res.render('../views/index')

现在一切正常。

答案 14 :(得分:0)

我遇到了同样的问题。然后只需检查资源管理器中的文件目录。有时视图文件夹不存在。