web-dev-qa-db-ja.com

Express-jsでルートを使用する

だから私はNode.jsを使い始めています。 Nodejs.org でRyan Dahlのビデオを見て、彼がWebサイトにExpress-jsを推奨していると聞きました。

Expressの最新バージョンをダウンロードし、コーディングを開始しました。 /に完全な静的ビューがありますが、パラメーターを送信しようとするとすぐに、次のようなエラーが表示されます。

Cannot GET /wiki

expressjs.com のガイドに従ってみましたが、最新バージョンではルートの使用方法が変更されたため、ガイドが使用できなくなりました。

ガイド:

app.get('/users/:id?', function(req, res, next){
    var id = req.params.id;
    if (id) {
        // do something
    } else {
        next();
    }
});

Expressによって生成:

app.get('/', routes.index);

別のルートを追加しようとすると、問題が発生します。

app.get('/wiki', routes.wiki_show);

たくさんのアプローチを試しましたが、Cannot GET /wiki(404)エラー。

routes/index.jsは次のようになります。

exports.index = function(req, res) {
    res.render('index', { title: 'Test', articles: articles, current_article: current_article, sections: sections })
};

そこで行った唯一のことは、いくつかのパラメーター(同じファイル内の配列)を追加することで、これは機能します。しかし、コンテンツをコピーしてexports.indexからexports.wiki または exports.wiki_show私はまだCannot GET /wikiエラー。

誰かが私にここで何が欠けているのか説明できますか? -ありがとう。

45

そのため、質問を作成した後、右側にこの関連リストがあり、同様の問題がありました: Node.jsでルートを整理する

その投稿の答えは GitHubのExpressリポジトリ にリンクしており、 ' route-separation 'の例を参照することを提案しています。

これはコードを変更するのに役立ち、現在は機能しています。 - コメントしてくれてありがとう。

私の実装はこのようになりました。

App.jsにルートが必要です:

var express = require('express')
  , site = require('./site')
  , wiki = require('./wiki');

そして、次のようにルートを追加します。

app.get('/', site.index);
app.get('/wiki/:id', wiki.show);
app.get('/wiki/:id/edit', wiki.edit);

アプリのルートにwiki.jsとsite.jsという2つのファイルがあり、これが含まれています。

exports.edit = function(req, res) {

    var wiki_entry = req.params.id;

    res.render('wiki/edit', {
        title: 'Editing Wiki',
        wiki: wiki_entry
    })
}
75

route-map 明示的な例は、URLパスとオブジェクトを照合し、オブジェクトはhttp動詞と関数を照合します。これにより、ルーティングがツリーにレイアウトされ、簡潔で読みやすくなります。また、アプリのエンティティは、囲まれたメソッドとして機能するオブジェクトとして記述されます。

var express = require('../../lib/express')
  , verbose = process.env.NODE_ENV != 'test'
  , app = module.exports = express();

app.map = function(a, route){
  route = route || '';
  for (var key in a) {
    switch (typeof a[key]) {
      // { '/path': { ... }}
      case 'object':
        app.map(a[key], route + key);
        break;
      // get: function(){ ... }
      case 'function':
        if (verbose) console.log('%s %s', key, route);
        app[key](route, a[key]);
        break;
    }
  }
};

var users = {
  list: function(req, res){
    res.send('user list');
  },

  get: function(req, res){
    res.send('user ' + req.params.uid);
  },

  del: function(req, res){
    res.send('delete users');
  }
};

var pets = {
  list: function(req, res){
    res.send('user ' + req.params.uid + '\'s pets');
  },

  del: function(req, res){
    res.send('delete ' + req.params.uid + '\'s pet ' + req.params.pid);
  }
};

app.map({
  '/users': {
    get: users.list,
    del: users.del,
    '/:uid': {
      get: users.get,
      '/pets': {
        get: pets.list,
        '/:pid': {
          del: pets.del
        }
      }
    }
  }
});

app.listen(3000);
10
systemovich

Require( "./ routes")のときにindex.jsのみがロードされるようです。 index.jsで次のコードを使用して、残りのルートをロードしました。

var fs = require('fs')
  , path = require('path');

fs.readdirSync(__dirname).forEach(function(file){
  var route_fname = __dirname + '/' + file;
  var route_name = path.basename(route_fname, '.js');
  if(route_name !== 'index' && route_name[0] !== "."){ 
    exports[route_name] = require(route_fname)[route_name];
  }
});
5
Shlomi Loubaton

それらをモジュールに整理することもできます。だからそれは次のようになります。

./
controllers
    index.js
    indexController.js
app.js

そしてコントローラーのindexController.jsでコントローラーをエクスポートします。

//indexController.js
module.exports = function(){
//do some set up

var self = {
     indexAction : function (req,res){
       //do your thing
}
return self;
};

その後、コントローラのindex.jsディレクトリに

exports.indexController = require("./indexController");

そして最後にapp.jsで

var controllers = require("./controllers");

app.get("/",controllers.indexController().indexAction);

このアプローチはより明確な分離を可能にし、またおそらくdb接続を渡すことでコントローラーを設定できると思います。

4
Maleck13