使用普通Express.js进行分层路由

时间:2014-04-28 04:06:43

标签: node.js routes url-routing

我正在使用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);

我不喜欢这个有两个原因:

  1. 无论我是否需要它们,猫和狗模型都会被实例化。
  2. 我必须为每个路径架构重复/ cats和/ dogs
  3. 我喜欢这样的事情(当然没有工作):

    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',该怎么办?我会在路由器内的路由器中安装路由器,这对我来说似乎有点过分了。

2 个答案:

答案 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。这听起来正是您要找的。