web-dev-qa-db-ja.com

エラー:Expressでビューを検索できませんでした

:投稿の最後の自動応答

私はnodeJSのより良い体験をしようとしていますが、すべてのスクリプトを1つのファイルに入れるのは本当に好きではありません。

だから、ここの投稿に従ってこの構造を使用します

./
 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

私が得るエラーは:

エラー:レンダリング(c:\ xampp\htdocs)でFunction.render(c:\ xampp\htdocs\nodejs\buses\node_modules\express\lib\application.js:495:17)でビュー「index/index」を検索できませんでした\ 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) c:\ xampp\htdocs\nodejs\buses\config\routes.js:4:7コールバック(c:\ xampp\htdocs\nodejs\buses\node_modules\express\lib\router\index.js:177:11) 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)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)次に(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);

私はこの背後にあるロジックを本当に理解していませんが、それがあると思います。

53
nax

npm install [email protected]は、以前のバージョンをインストールします(それが役立つ場合)。

3.xでは、ビューレイアウトメカニズムが削除されましたが、これは問題ではないかもしれません。また、express.createServer()express()に置き換えます

更新:

Environment.jsからの__dirnameです
そのはず:

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

@mihaiの答えに追加:

Windowsを使用している場合は、__dirname' + '../public'を連結するだけで、間違ったディレクトリ名になります(例:c:\dev\app\module../public)。

代わりに、pathを使用します。これは、OSに関係なく機能します。

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

path.join は、パス区切り文字を正規化し、正しいパス値を返します。

33
Veera

最初は同じエラーがあり、本当にイライラしていました。テンプレートへのパスの前に./が必要です

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

うまくいけば、私のために働いた。

6

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");
});
4
Codemaker

適切なビューエンジンを使用しているかどうかを確認します。私の場合、npmを更新し、エンジンを「hjs」に変更することになりました(jagをアンインストールしてpugを使用しようとしました)。したがって、app.jsファイルでhjsからjadeに変更するとうまくいきました。

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

このコードを使用して問題を解決します

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

この問題は、基本的に大文字と小文字が区別されるファイル名が原因で発生します。たとえば、ルート上のたてがみよりもファイルを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");
});
1
user9160528

' index.html'の代わりに先頭にスペースを付けて、ファイルに'index.html'という名前を付けたことに注意してください。それが見つからなかった理由です。

1
Bobby

パスをこのような定数に設定し、エクスプレスを使用して設定できます。

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

 app.set('views', viewsPath)

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

 res.render("index");

});

これは私のために働いた

0
Harish-hk

私は同じ問題を抱えていましたが、ダグウィルソンのソリューションで修正できました:2017年4月5日、 Github

  1. ファイル名をindex.jsからindex.pugに変更しました
  2. 次に、'/'ルートで使用されます:res.render('index.pug')の代わりにres.render('index')-
  3. 環境変数を設定します:DEBUG=express:viewこれで、チャームのように機能します。
0
Chris

私は、viewsフォルダ名をviews_renderに変更し、上記と同じ問題に直面しているため、server.jsを再起動してください。

0
Vivek

Linuxでもこの問題が発生しました

I had the following

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

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

すべてが現在機能しています。

0
Chris Bounds

このエラーは実際にファイルのパスに関係しています。確認する必要があるのは、親フォルダが「レイアウト」でしたが、実際のファイルはlayout.htmlでした。エラーはなくなりました。

0
Hilary Mwape