我想使用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
答案 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')
是单例导入。
如果有人知道这个额外问题的解决方案,请告诉我!!!