2012-04-03 8 views
11

expressjs用の別のフォルダにルートがあります。設定は 'index'ページでうまく動作していますが、追加のルートではうまく動作していません。nodejs ExpressJSのルートのみがインデックス用に動作します

これは私のルートフォルダ内のindex.jsです。

module.exports = function(db) { 

    return { 
     index: function(req, res, next) { 
      res.send('index'); 
     } 
    } 
} 

これは私のルートフォルダ内のjoin.jsです。私app.jsで

module.exports = function(db) { 

    return { 
     join: function(req, res, next) { 
      res.send('join'); 
     } 
    } 
} 

、私はこのような私のルートを定義します。

  var routes = require('./routes')(db); 
      app.get('/', routes.index); 
      app.get('/join', routes.join); 

私はhttp://localhost:3000に行くが、私はhttp://localhost:3000/joinに行くとき、私は私のルートを定義する場合、私はCannot GET /join

を取得このような参加のため:

app.get('/join', function(req, res){ 
    res.send('join 2'); 
}); 

これは機能します。

ここで間違っているのは何ですか?

ありがとうございました!

答えて

0

同様のシナリオをテストしたところ、私にとってはうまくいった。

おそらく、あなたのroutes.jsファイルに間違いがあると思います。 あなたはそうやっている:

routes.index = require('./index')(db); 
routes.join = require('./join')(db); 

をたぶんあなただけrequire(./join)をやって、joinのためのメソッドを呼び出すことを忘れ。 ちょうど推測。

6

私は同様の問題を抱えていましたが、これはすべて「ただのjavascript」であり、答えを混乱させることができました。

var express = require('express') 
    , routes = { 
     index: require('./routes').index 
    , events: require('./routes/events.js').events 
    } 
    , hbs = require('hbs'); 
:あなただけのルートを構築することができます

複数のファイルで定義されたあなたのルートを持っているしたい場合は(代わりに1つのルート/ index.jsファイルにそれらのすべてを詰め込むのは)ハック方法(次のように)中のオブジェクト

注:にはのexpressとhbsの定義(最初と最後の行)が必要ですが、ちょっとした文脈を与えるためにそこに入れています。このコードスニペットは、app.jsファイルの先頭から直接取得したものです。

require()関数呼び出しには、.index.eventsがチェーンされています。それが鍵です。 require()機能は基本的にファイルをつかみ、(輸入)任意の非プライベートVARS(つまり、特別なexportsオブジェクトに付されたものを)を必要とするので

exports.events = function(req, res){ 
    console.log('in events'); 
    res.render('events', { events: events, title: "EVENTS" }); 
    console.log('events done'); 
}; 

:マイevents.jsファイルは一つだけのエクスポート(イベント)を持っていますrequire()呼び出しを含むファイルにそれらを公開すると、私はrequire()呼び出しを含むファイルから必要な特定の機能を取得できます。私は必要なファイルで定義された複数の輸出を持っていた場合、私は(テストしていない)私はそうのようにそれらをつかむことができ想像:

routes = { 
    index: require('./routes').index 
    , events: require('./routes/events.js').events 
    , favorites: require('./routes/events.js').favorites 
    , upcoming: require('./routes/events.js').upcoming 
} 

私は、これがあれば、動脈瘤を経験しnodeJSまたはMVCの束を持つ人を与えるだろうと思われます彼らはあなたのコードを読んでいる(私はそれが同じファイルを3回含むことを賭けているが、私は本当にわからない)。

routes = { 
    index: require('./routes').index 
    , events: require('./routes/events.js').events 
    , favorites: require('./routes/favorites.js').favorites 
    , upcoming: require('./routes/upcoming.js').upcoming 
} 

それ以外の場合は、すべてをインデックスに表示しないでください。

console.log(routes); 
:しかし、これはあなたが右のあなたのvar宣言の後にconsole.logステートメントを投げる場合

はまた、おそらくあなたを助ける...唯一のノードとその関連技術のいずれかでの作業私の二日目は本当にわかりません

+0

+1 "しかし、これはすべて"ただのjavascript "であり、答えを混乱させることができました。 !!素晴らしい答え:) –

+0

"モジュールは最初に読み込まれた後にキャッシュされます" http://nodejs.org/api/modules.html#modules_caching –

3

routes/index.jsファイルが動作し、routes/join.jsが動作しない理由は、ノードのモジュールロードルールが原因です。 modules/folders as modulesの文書をチェックしてください

これらのファイルを順番にロードしようとしています。 package.json,index.js,index.node

ディレクトリにpackage.jsonファイルを作成して、ロードするファイルを変更することができます。新しいファイルの名前にmainプロパティを設定します。

あなたが望むようにルートを動作させる方法の例は、another questionです。

0

あなただけのデフォルトで

var routes = require('./routes') 

を言うならば、ノードは、(それがindex.jsかindex.nodeのかどうか)インデックスファイルを探し始めます。結合ファイルを使用したい場合は、明示的にそれを言う必要があります:

var join = require('./routes/join') 

今私はjoin.joinは動作するはずだと思います。

0

同様の問題がありました。

私の "/"ルートのみが機能しました。 "/ about"を作成しようとすると404エラーが発生します。

私は特急・ジェネレータを使用する場合、それは書い判明:

app.use('/about', ...etc) 

をする代わりに、それがされている必要があります:

app.all('/about', ...etc) 

私はそのない正確に同じ問題を知っているが、これは誰が外れるためでありますここでは「唯一の索引が働いています...」問題と同じ質問を探しています。

関連する問題