我开始使用 node.js 并表达一些宁静的 API。我将我的逻辑分解为控制器。每个控制器都有一些与我的 API 正在执行的操作相对应的方法。我不想每次向现有控制器添加新功能或使用新控制器添加全新功能时都必须更新路由。为此,我试图让我的 restful 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);
});
}
以这种方式设置有什么问题吗?
有没有更好的方法来做到这一点?