我正在使用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);
我不喜欢这个有两个原因:
猫和狗模型都是实例化的,无论我是否需要它们.
我必须为每个路径模式重复/ cats和/ dogs
我喜欢这样的东西(当然不行):
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'
怎么办?然后我会在路由器内的路由器中安装路由器,这对我来说似乎有些过分.
然后我会在路由器内的路由器中安装路由器,这对我来说似乎有些过分.
也许,但是这是前缀的内置方法-以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(...); }); });