我正在使用Node和Express实现RESTful API。说到路由,目前它看起来像这样:
var cat = new CatModel();
var dog = new DogModel();
app.route('/cats').get(cat.index);
app.route('/cats/:id').get(cat.show).post(cat.new).put(cat.update);
app.route('/dogs').get(dog.index);
app.route('/dogs/:id').get(dog.show).post(dog.new).put(dog.update);
我不喜欢这个有两个原因:
我喜欢这样的事情(当然没有工作):
app.route('/cats', function(req, res)
{
var cat = new CatModel();
this.route('/').get(cat.index);
this.route('/:id').get(cat.show).post(cat.new).put(cat.update);
});
app.route('/dogs', function(req, res)
{
var dog = new DogModel();
this.route('/').get(dog.index);
this.route('/:id').get(dog.show).post(dog.new).put(dog.update);
});
现代Express中是否有一种干净的方式,没有任何其他模块(如express-namespace)?我可以为每个模型选择单独的路由器并使用app.use('/cats', catRouter)
分配它们。但是,如果我有多个层次结构级别'/tools/hammers/:id'
,该怎么办?我会在路由器内的路由器中安装路由器,这对我来说似乎有点过分了。
答案 0 :(得分:13)
然后我会在路由器内的路由器中安装路由器,这对我来说似乎有点过分了。
也许,但这是内置的前缀方法 - app.use()
Router()
。
var cats = express.Router();
app.use('/cats', cats);
cats.route('/').get(cat.index);
cats.route('/:id').get(cat.show).post(cat.new).put(cat.update);
// ...
并且,让另一个Router
.use()
定义多个深度:
var tools = express.Router();
app.use('/tools', tools);
var hammers = express.Router();
tools.use('/hammers', hammers);
// effectively: '/tools/hammers/:id'
hammers.route('/:id').get(...);
但是,为了更接近您的第二个片段,您可以定义自定义方法:
var express = require('express');
express.application.prefix = express.Router.prefix = function (path, configure) {
var router = express.Router();
this.use(path, router);
configure(router);
return router;
};
var app = express();
app.prefix('/cats', function (cats) {
cats.route('/').get(cat.index);
cats.route('/:id').get(cat.show).post(cat.new).put(cat.update);
});
app.prefix('/dogs', ...);
app.prefix('/tools', function (tools) {
tools.prefix('/hammers', function (hammers) {
hammers.route('/:id').get(...);
});
});
答案 1 :(得分:0)
查看Express 4中的new Router。这听起来正是您要找的。 p>