错误:在Express中查找视图失败。

80

注意: 我在帖子末尾提供了自动回答。

我正在尝试改善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

翻译为:

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

我收到的错误信息是:

Error: Failed to lookup view "index/index" at Function.render (c:\xampp\htdocs\nodejs\buses\node_modules\express\lib\application.js:495:17) at render (c:\xampp\htdocs\nodejs\buses\node_modules\express\lib\response.js:614:9) at ServerResponse.render (c:\xampp\htdocs\nodejs\buses\node_modules\express\lib\response.js:638:5) at c:\xampp\htdocs\nodejs\buses\config\routes.js:4:7 at callbacks (c:\xampp\htdocs\nodejs\buses\node_modules\express\lib\router\index.js:177:11) at param (c:\xampp\htdocs\nodejs\buses\node_modules\express\lib\router\index.js:151:11) at pass (c:\xampp\htdocs\nodejs\buses\node_modules\express\lib\router\index.js:158:5) at Router._dispatch (c:\xampp\htdocs\nodejs\buses\node_modules\express\lib\router\index.js:185:4) at Object.router [as handle] (c:\xampp\htdocs\nodejs\buses\node_modules\express\lib\router\index.js:45:10) at next (c:\xampp\htdocs\nodejs\buses\node_modules\express\node_modules\connect\lib\proto.js:191:15)

但我不知道问题出在哪里...

我开始认为可能是模块导出的原因...

回答: 目前我找到的唯一解决方案是将定义 app.set('views')和 views engine 的位置更改。

我将它移动到了 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版本有些不同。 - mihai
可能是因为我正在遵循http://expressjs.com的指南,但我没有看到任何关于express3的相关内容:s - nax
是的,它仍处于alpha版本。如果你最近使用npm安装了它,你应该已经拥有了3.0.0alpha版本。最好执行npm ls命令查看你所拥有的版本。 - mihai
抱歉,我忘记了补充,我有3.0.0alpha1版本。有没有办法使用v2版本,或者最好获取任何相关文档? - nax
当问题的自动回答比被采纳的答案更好时... - Marcel
21个回答

43

在@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'); app.use($.express.static($.path.join(__dirname, '/../public'))); - Lucas

39

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

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

更新:

这是从 environment.js 获取的 __dirname。
应该是:

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

这不是版本问题...我安装了2.5.9,但仍然出现相同的错误。 - nax
1
我获取了所有应用程序代码并将其全部放在同一个app.js文件中,它正在工作...所以...它是module.exports结构以某种方式失败了... - nax
哦,该死,你是对的...我只是按照PHP的要求思考问题...好的!问题解决了:D谢谢! - nax
不确定那两个点号应该修复什么,但对我来说它们肯定没有修复任何东西... - Tomáš Zato
@TomášZato express.static(__dirname + '../public') 中的两个点表示“从 ___dirname 的上一级目录开始”。如果 ___dirname 被设置为 */app/private/*,'../public' 将把它更改为 */app/public/*。 - Sometowngeek

16

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

13

一开始我也遇到了同样的错误,非常烦恼。 你只需要在模板路径前加上 ./ 即可。

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

希望它能够正常工作,对我来说有效。


1
类似的答案对我有用(在2019年)。不得不将“../index”而不仅仅是“index”放入才能使其查找上一级文件。 - Ant
这解决了我的问题。谢谢。 - Moss

8

您可以像这样将路径设置为常量,并使用 Express 设置它。

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

 app.set('views', viewsPath)

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

 res.render("index");

});

这对我有用。

3

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

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

3
在我的情况下,我用以下方法解决了这个问题:
app.set('views', `${__dirname}/views`);
app.use(express.static(`${__dirname}/public`));

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

我的文件夹结构如下:

Start app from /dist


2

这个问题通常是由于文件名的大小写敏感性引起的。例如,如果您将文件保存为index.jadge,则在路由上它的名称应该是"index"而不是"Index"。在Windows中,这没有问题,但在像Linux服务器这样的系统中,这将会创建问题。

1) 如果文件名是index.jadge

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

2) 如果文件名是 Index.jadge

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

出现了大小写敏感的问题。干杯 - stefan

1
使用这段代码来解决问题。
app.get('/', function(req, res){
    res.render("index");
});

5
如果你能说明它为什么有帮助以及它实际起到了什么作用,那将会很有帮助。 - jwenting
首先,我使用了app.use(express.static(__dirname + '../public'));代码,但问题仍然存在。然后我使用了上述代码,最终解决了问题。该代码的含义是当localhost:3000访问时,使用视图引擎(如hjs)在指定目录中呈现可用的index.hjs文件。 - KARTHIKEYAN.A

1

刚刚注意到我把文件命名为' index.html'而不是'index.html',前面有一个空格。这就是为什么找不到它的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接