2016-08-18 4 views
0

Я хотел бы расширить «базовые» звонки REST с помощью экспресс, но я думаю, что у меня есть ограничение (или мое отсутствие понимания). Я хочу, чтобы все конечные точки 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); 

Затем используйте переменную для базовой конечной точки, но она появляется, она может обрабатывать динамические маршруты во время выполнения.

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

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

Возможно ли это? Если да, то как я могу это достичь?

Пожалуйста, обратите внимание, я использую Экспресс v4

+0

Так что я предполагаю, что это невозможно? Кто угодно? – gpeters

ответ

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') является импортом одноэлементным.

Если кто-нибудь знает решение этой дополнительной проблемы, дайте мне знать !!!

+1

Ссылка на потенциальное решение всегда приветствуется, но, пожалуйста, [добавьте контекст вокруг ссылки] (http://meta.stackoverflow.com/a/8259/169503), чтобы ваши друзья-пользователи имели представление о том, что это такое и почему Это здесь. Всегда указывайте наиболее значимую часть важной ссылки, если целевой сайт недоступен или постоянно находится в автономном режиме. Примите во внимание, что быть более чем ссылкой на внешний сайт_ является возможной причиной [Почему и как удаляются некоторые ответы?] (Http://stackoverflow.com/help/deleted-answers). –

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) 

Экспорт маршрутизатор в качестве модуля локального узла.

Смежные вопросы