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

nax*_*nax 56 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
Run Code Online (Sandbox Code Playgroud)

我的文件现在是:

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);
Run Code Online (Sandbox Code Playgroud)

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());
    });

};
Run Code Online (Sandbox Code Playgroud)

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');
    });

};
Run Code Online (Sandbox Code Playgroud)

layout.jade

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

指数/ index.jade

h1 algoa
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

错误:无法在渲染时在Function.render(c:\ xampp\htdocs \nodejs\_bus \node_modules\express\lib\application.js:495:17)中查找视图"index/index"(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)at at 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)在Object.router [作为句柄]的Router._dispatch(c:\ xampp\htdocs \nodejs\_bus \node_modules\express\lib\router\index.js:185:4) (c:\ xampp\htdocs \nodejs\_bus \node_modules\express\lib\router\index.js:45:10)at next(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);
Run Code Online (Sandbox Code Playgroud)

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

Vee*_*era 34

添加到@mihai的答案:

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

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

var path = require ('path');
app.use(express.static(path.join(__dirname + '.../public')));
Run Code Online (Sandbox Code Playgroud)

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


mih*_*hai 32

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

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

更新:

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

app.use(express.static(__dirname + '../public'));
Run Code Online (Sandbox Code Playgroud)


Cod*_*ker 11

在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");
});
Run Code Online (Sandbox Code Playgroud)


小智 6

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

res.render('./index/index');
Run Code Online (Sandbox Code Playgroud)

希望它对我有用。


Har*_*ula 6

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

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

 app.set('views', viewsPath)

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

 res.render("index");

});
Run Code Online (Sandbox Code Playgroud)

这对我有用