快速变量基本路由(REST)

时间:2016-08-18 14:11:08

标签: node.js rest express

我想使用express来扩展“基本”REST调用,但我认为我遇到了限制(或者我缺乏理解)。我希望所有REST端点共享相同的基本REST路由。我不想为每个端点服务(即行星,星等等)编写这些内容

app.get('/api/planet/type',function(req,res) {
     ...
});

app.get('/api/planet/type/:_id',function(req,res) {
    ...
});

app.post('/api/planet/type',function(req,res) {
    ...
});

app.patch('/api/planet/type/:_id',function(req,res){
    ...
});

app.delete('/api/planet/type/:_id',function(req,res) {  
    ...     
});

我更喜欢做的是在我的实施模块中使用变量

require('base-rest')('/api/planet/type',planet-model);
require('base-rest')('/api/star/type',star-model);

然后使用变量作为基本端点,但看起来express可以在运行时处理动态路由。

app.get(baseURL,function(req,res) {
     ...
});

app.get(baseURL+'/:_id',function(req,res) {
    ...
});

这可能吗?如果是这样,我怎么能实现这个目标呢?

请注意,我正在使用Express v4

2 个答案:

答案 0 :(得分:0)

可能你想做这样的事情:

var planet = express.Router()
planet.get('/type', function (req, res) { ... })
planet.get('/type/:id', function (req, res) { ... })
planet.post('/type', function (req, res) { ... })
planet.post('/type/:id', function (req, res) { ... })
planet.delete('/type/:id', function (req, res) { ... })

app.use('/api/planet', planet)

将路由器导出为本地节点模块。

答案 1 :(得分:0)

实际上可以这样做(有警告)。哈格的帖子对此有所概述。

//base.js

var express = require('express');
var router = express.Router();
....
router.get('/:id', function(req, res) {
    ....
});
//Additional routes here

module.exports = router

实施档案

//planets.js
var base = require('./base');
app.use('/api/planets',base);

详情请见https://expressjs.com/en/guide/routing.html

然而,有一点需要注意。我不能将base.js重用于多个实现,因为node.js默认使用单例作为require('./base')。这意味着当我真正想要一个新实例时,您将获得相同的实例。为什么?因为我想为每条基本路线注入我的模型。

例如:

var model = null;
module.exports.map = function(entity) {
    model = entity;
}

router.get('/:id', function(req, res) {
    model.findOne(...) //using mongoose here
});

同一模型将用于跨多个模块的所有路由,因为require('./base')是单例导入。

如果有人知道这个额外问题的解决方案,请告诉我!!!