だから私は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
エラー。
誰かが私にここで何が欠けているのか説明できますか? -ありがとう。
そのため、質問を作成した後、右側にこの関連リストがあり、同様の問題がありました: 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
})
}
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);
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];
}
});
それらをモジュールに整理することもできます。だからそれは次のようになります。
./
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接続を渡すことでコントローラーを設定できると思います。