错误:无法在 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ášZatoexpress.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.js 从请求中获取 POST 正文