72

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

我正在尝试更好地体验 nodeJS,但我真的不喜欢将所有脚本放在一个文件中。

所以,按照这里的帖子,我使用这个结构

./
 config/
   enviroment.js
   routes.js
 public/
   css/
     styles.css
   images
 views
   index
     index.jade
   section
     index.jade
   layout.jade
 app.js

我的文件现在是:

应用程序.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);

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

};

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

};

布局.jade

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

索引/索引.jade

h1 algoa

我得到的错误是:

错误:在渲染 (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);

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

4

17 回答 17

41

添加到@mihai的答案:

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

而是使用path,这将与操作系统无关:

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

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

于 2012-08-28T21:10:16.740 回答
35

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

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

更新:

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

app.use(express.static(__dirname + '../public'));
于 2012-04-18T19:45:38.133 回答
12

通过在 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");
});
于 2018-06-28T13:26:06.753 回答
10

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

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

希望它有效,对我有用。

于 2017-11-06T14:17:18.170 回答
7

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

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

 app.set('views', viewsPath)

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

 res.render("index");

});

这对我有用

于 2019-06-07T14:07:33.340 回答
3

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

 app.set('view engine','jade'); 
于 2016-09-07T04:40:23.677 回答
3

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

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

我需要node app.min.js/dist文件夹开始。

我的文件夹结构是:

从 /dist 启动应用程序

于 2020-03-19T17:41:41.353 回答
2

由于区分大小写的文件名,基本上可以看到此问题。例如,如果您将文件保存为 index.jadge,而不是路径上的鬃毛,则在 Windows 中它应该是“索引”而不是“索引”,这没关系,但在像服务器这样的 linux 中,这会产生问题。

1)如果文件名是index.jadge

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

2)如果文件名是Index.jadge

app.get('/', function(req, res){
      res.render("Index");
});
于 2018-11-11T18:44:51.977 回答
1

使用此代码解决问题

app.get('/', function(req, res){
    res.render("index");
});
于 2016-09-01T12:58:39.187 回答
1

只是注意到我用前导空格命名了我的' index.html'文件'index.html'。这就是它找不到它的原因。

于 2017-02-26T16:34:34.923 回答
1

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

于 2018-05-25T18:40:38.090 回答
0

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

于 2016-07-08T18:23:38.497 回答
0

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

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

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

I had the following

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

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

现在一切正常。

于 2019-08-17T20:39:57.570 回答
0

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

于 2021-03-29T16:38:14.480 回答
0

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

node D:\webapp\app.js

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

cd D:\webapp
于 2021-09-16T11:33:02.017 回答
0

我遇到了同样的问题,但是,我将文件名从 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);

于 2021-11-17T23:32:32.903 回答