我開始使用node.js並表達一些寧靜的API。我把我的邏輯分解成控制器。每個控制器都有一些對應於我的API的方法。我不想每次使用新控制器向現有控制器或現有控制器添加新功能或全新功能時更新我的路線。爲此,我試圖通過一組簡單的路由來定義我的restful api,並且足夠聰明地根據現有的控制器和方法進行處理。爲此,我有這個...在node.js中顯示「自動」路由
"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);
});
}
這樣設置的東西有任何問題嗎?
有沒有更好的方式去做這件事?
或類似於Rails的機車(http://locomotivejs.org/)(Express更像Sinatra)。 – tandrewnichols