12

Expressjs 用の別のフォルダーにルートがあります。セットアップは「インデックス」ページでは正常に機能していますが、追加のルートでは機能していません。

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

 module.exports = function(db) {

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

これは、routes フォルダー内の join.js です。

 module.exports = function(db) {

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

私の app.js では、次のようにルートを定義します。

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

これは機能します。

ここで何が間違っているのか分かりますか?

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

4

5 に答える 5

6

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

ルートを複数のファイルで定義したい場合(すべてを1つのroutes / index.jsファイルに詰め込むのではなく)、ハック的な方法でルートオブジェクトを作成できます(次のように)。

var express = require('express')
  , routes = {
       index: require('./routes').index
     , events: require('./routes/events.js').events
  }
  , hbs = require('hbs');

注:そこにexpressとhbsの定義(最初と最後の行)は必要ありません。少しコンテキストを与えるためにそこに入れます。このコードスニペットは、私のapp.jsファイルの先頭から直接取得されました。

.indexとが関数呼び出し.eventsにチェーンされていることに注意してください。require()それが鍵です。私のevents.jsファイルには1つのエクスポート(イベント)しかありません:

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

関数は基本的にファイルを取得し、require()非プライベート変数(つまり、特別なオブジェクトにアタッチされている変数)を必要とし(インポート) 、呼び出しexportsを含むファイルにそれらを公開するため、特定の関数を取得することができます。 require()mrequire()呼び出しに含めているファイルから要求します。必要なファイルに複数のエクスポートが定義されている場合、そのようにそれらを取得できると思います(テストされていません)。

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
}

それ以外の場合は、それらすべてをインデックスに入れてみませんか?確かではありませんが、Nodeとそれに関連するテクノロジーを使用するのは2日目です...

また、var宣言の直後にconsole.logステートメントをスローすると、おそらく役に立ちます。

console.log(routes);
于 2012-04-10T21:12:20.597 に答える
3

ルート/index.jsファイルが機能し、routes / join.jsが機能しない理由は、ノードのモジュール読み込みルールが原因です。モジュールとしてのモジュール/フォルダのドキュメントを確認してください

これらのファイルを順番にロードしようとするということです。package.json、、。index.js_index.node

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

ルートを希望どおりに機能させる方法の例は、別の質問にあります。

于 2012-04-21T18:09:27.997 に答える
0

私は同様のシナリオをテストしました、そしてそれは私のために働きました。

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

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

たぶん、のメソッドを呼び出すのを忘れてjoin、ただ実行するだけrequire(./join)です。ただの推測。

于 2012-04-04T07:39:35.830 に答える
0

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

私の「/」ルートだけが機能しました。「/about」を作成しようとすると、404 エラーが発生します。

Express-generator を使用すると、次のように書かれていることがわかりました。

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

代わりに、次のようにする必要があります。

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

まったく同じ問題ではないことはわかっていますが、これは、「インデックスのみが機能する...」問題と同じ質問を探している迷子のためのものです。

于 2016-09-06T19:42:59.937 に答える