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

Posted

技术标签:

【中文标题】错误:无法在 Express 中查找视图【英文标题】:Error: Failed to lookup view in 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,或者,如果最好获取任何文档? 当问题的自动答案优于接受的答案时... 【参考方案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。

    我将文件名从index.js 更改为index.pug 然后在'/' 路由中使用:res.render('index.pug') - 而不是res.render('index') 设置环境变量: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);

【讨论】:

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

Express 错误 500:无法在视图目录“/app/views”中查找视图“index.html”

Express - 无法查找视图

无法使用 Express.js 从请求中获取 POST 正文

错误:无法在视图目录节点 JS 和 Jquery 错误中查找视图“错误”

错误:无法在视图目录中查找视图“布局”

运行 MEAN 应用程序时出现“无默认引擎”错误