【问题标题】:Error: Failed to lookup view in Express错误:无法在 Express 中查找视图
【发布时间】:2012-04-30 06:40:22
【问题描述】:

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

我正在尝试为 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/index.jade

h1 algoa

我得到的错误是:

错误:无法查找视图“索引/索引” 在 Function.render (c:\xampp\htdocs\nodejs\buses\node_modules\express\lib\application.js:495:17) 在渲染 (c:\xampp\htdocs\nodejs\buses\node_modules\express\lib\response.js:614:9) 在 ServerResponse.render (c:\xampp\htdocs\nodejs\buses\node_modules\express\lib\response.js:638:5) 在 c:\xampp\htdocs\nodejs\buses\config\routes.js:4:7 在回调(c:\xampp\htdocs\nodejs\buses\node_modules\express\lib\router\index.js:177:11) 在参数处(c:\xampp\htdocs\nodejs\buses\node_modules\express\lib\router\index.js:151:11) 通过 (c:\xampp\htdocs\nodejs\buses\node_modules\express\lib\router\index.js:158:5) 在 Router._dispatch (c:\xampp\htdocs\nodejs\buses\node_modules\express\lib\router\index.js:185:4) 在 Object.router [作为句柄] (c:\xampp\htdocs\nodejs\buses\node_modules\express\lib\router\index.js:45:10) 在下一个 (c:\xampp\htdocs\nodejs\buses\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);

我不太明白这背后的逻辑,但我想它有一个。

【问题讨论】:

  • 我想你还在使用 express 2.x,因为 3.x 中的情况有点不同
  • 可能是这样。我正在关注expressjs.com 的指南,但我没有看到任何与 express3 相关的内容:s
  • 是的,它仍处于 alpha 阶段。如果你最近安装了 npm,你应该拥有它(3.0.0alpha)。最好发npm ls 看看你有什么版本。
  • 对不起,我忘了补充,我有 3.0.0alpha1 有什么方法可以使用 v2,或者,如果最好获取任何文档?
  • 当问题的自动答案优于接受的答案时...

标签: node.js express pug


【解决方案1】:

npm install express@2.5.9 安装以前的版本,如果有帮助的话。

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

更新:

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

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

【讨论】:

  • 不是版本问题...我安装了2.5.9还是一样的错误
  • 我得到了所有的应用程序代码,并将它们全部放在同一个 app.js 中并且它正在工作......所以......它的 module.exports 结构在某种程度上失败了......跨度>
  • 哦,嘘,你说得对...我只是按照 php 需要的方式思考...好吧!解决问题:D 谢谢!
  • 不确定这两个点应该解决什么问题,但它们肯定没有为我解决任何问题......
  • @TomášZato express.static(__dirname + '../public') 中的两个点表示“来自 __dirname 的上一个目录。如果设置了 __dirname/app/private/'../public' 会将其更改为 /app/public/
【解决方案2】:

添加到@mihai 的答案:

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

请改用path,这将与操作系统无关:

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

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

【讨论】:

  • 谢谢!在此响应的帮助下,我使用了稍微不同的解决方案(在 Windows 上): app.set('views', __dirname + '/../views'); AND app.use($.express.static($.path.join(__dirname, '/../public')));
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    使用此代码解决问题

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

    【讨论】:

    • 如果你说为什么它应该有帮助,它实际上做了什么会有所帮助。
    • 首先我使用 app.use(express.static(__dirname + '../public'));代码仍然存在问题,然后我使用上面的代码修复了问题。代码的含义是当 localhost:3000 在可用的 index.hjs 被渲染时,使用所需目录中的 hjs 之类的视图引擎。
    【解决方案5】:

    检查您是否使用了正确的视图引擎。 就我而言,我更新了 npm 并最终将引擎更改为“hjs”(我试图卸载jade以使用哈巴狗)。 所以将它从 app.js 文件中的 hjs 更改为玉对我有用。

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

    【讨论】:

      【解决方案6】:

      刚刚注意到我将文件命名为 ' index.html' 而不是 'index.html' 并带有前导空格。这就是它找不到它的原因。

      【讨论】:

        【解决方案7】:

        一开始我也犯了同样的错误,我真的很生气。 你只需要在模板路径之前有./

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

        希望它有效,对我有用。

        【讨论】:

        • 对此的类似回答对我有用(2019 年)。必须放 '../index' 而不是 'index' 才能让它查找上一层的文件。
        • 这解决了我的问题。谢谢。
        【解决方案8】:

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

        【讨论】:

          【解决方案9】:

          在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");
          });
          

          【讨论】:

            【解决方案10】:

            这个问题基本上是因为文件名区分大小写。 例如,如果您将文件保存为 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");
            });
            

            【讨论】:

            • 有区分大小写的问题。干杯
            【解决方案11】:

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

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

            【讨论】:

              【解决方案12】:

              您可以像这样将路径设置为常量并使用 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】:

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

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

                现在一切正常。

                【讨论】:

                  【解决方案14】:

                  就我而言,我用以下方法解决了它:

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

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

                  我的文件夹结构是:

                  【讨论】:

                    【解决方案15】:

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

                    【讨论】:

                      【解决方案16】:

                      在我的例子中,我在 Windows Server 上部署了我的 Web 应用程序,并且我设置了一个服务来运行只有一行作为内容的 .bat 文件:

                      node D:\webapp\app.js
                      

                      但这还不够。在此之前我还必须更改目录,所以我在 .bat 文件的开头添加了以下行:

                      cd D:\webapp
                      

                      【讨论】:

                        【解决方案17】:

                        我遇到了同样的问题,但是我将文件名从 index.html 更改为 index.ejs 并且可以工作!!!!

                        const express = require('express');
                        const router = express.Router();
                        
                        router.get('/', (req, res) => {
                            res.render('index');
                        });
                        
                        router.get('/contact', (req, res) => {
                          res.render('contact', { title: 'Contact Page' });
                        });
                        
                        module.exports = router;
                        

                        和 index.js

                        const express = require('express');
                        const morgan = require('morgan');
                        const path = require('path');
                        const app = express();
                        
                        
                        
                        //settings
                        app.set('port', 4000);
                        app.set('views', path.join(__dirname,'views'));
                        app.set('view engine', 'ejs');
                        
                        //middlewares
                        
                        //routes
                        app.use(require('./routes'));
                        
                        //static files
                        
                        //listening
                        app.listen(app.get('port'), () => {
                          console.log('Server is running at http://localhost:'+app.get('port')+'/');
                        });
                        

                        更新: 将其添加到索引中:

                        app.engine('html', require('ejs').renderFile);

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 2015-08-19
                          • 2021-07-23
                          • 1970-01-01
                          • 1970-01-01
                          • 2016-01-27
                          • 2021-08-15
                          • 2014-02-07
                          • 1970-01-01
                          相关资源
                          最近更新 更多