私は node.js を使い始めて、いくつかの安らかな API を表現しています。ロジックをコントローラーに分割しています。各コントローラーには、API の実行内容に対応するメソッドがいくつかあります。新しい機能を既存のコントローラーに追加するたびに、または新しいコントローラーでまったく新しい機能を追加するたびに、ルートを更新する必要はありません。そのために、単純な一連のルートで定義された安らかな API を作成し、既存のコントローラーとメソッドに基づいて物事を理解するのに十分なほどスマートにしようとしています。そのために、私はこれを持っています...
"use strict";
module.exports = function (app) {
var routes = [
{
'get' : true,
'put' : false,
'post' : false,
'update' : false,
'delete' : false,
'controller' : '',
'action' : 'search',
'url' : '/:controller/search/:query/:page?'
},
{
'get' : true,
'put' : false,
'post' : false,
'update' : false,
'delete' : false,
'controller' : '',
'action' : '',
'url' : '/:controller/'
},
{
'get' : true,
'put' : false,
'post' : true,
'update' : true,
'delete' : true,
'controller' : '',
'action' : '',
'url' : '/:controller/:id'
},
{
'get' : true,
'put' : false,
'post' : true,
'update' : false,
'delete' : false,
'controller' : '',
'action' : '',
'url' : '/:controller/:id/:action'
}
];
function setupRoute(method, item) {
if (method in item && item[method]) {
console.log('Init route: ' + method.toUpperCase() + ' ' + item.url);
app[method](item.url, function(req, res) {
var c = '';
if ('controller' in item) {
c = item.controller;
}
var a = '';
if ('action' in item) {
c = item.action;
}
if ('controller' in req.params) {
c = req.params.controller;
}
if ('action' in req.params) {
a = req.params.action;
}
if (c == '') {
c = 'default';
}
if (a != '') {
a += '_';
}
a += req.method.toLowerCase();
c = c.toLowerCase();
a = a.toLowerCase();
if (c in app.controllers) {
if (a in app.controllers[c]) {
app.controllers[c][a](req, res);
} else {
console.log('Unknown action on controller ' + a);
res.status(400).send('Bad Request');
}
} else {
console.log('Unknown Controller ' + c);
res.status(404).send('Not found');
}
});
} else {
app[method](item.url, function(req, res) {
res.status(405).send('Method Not Allowed');
}
}
}
routes.forEach(function(item) {
setupRoute('get', item);
setupRoute('put', item);
setupRoute('post', item);
setupRoute('update', item);
setupRoute('delete', item);
});
}
このように設定することに問題はありますか?
これを行うためのより良い方法はありますか?