2016-08-19 5 views
3

У меня есть несколько маршрутов. Как я могу получить данные с маршрута пользователя (метод GET), вызвав его в методе GET маршрута группы? Каков наилучший способ сделать это?Экспресс-вызов метода GET в пределах маршрута от другого маршрута

My app.js выглядит следующим образом:

var express = require('express'); 
 

 
var routes = require('./routes/index'); 
 
var users = require('./routes/users'); 
 
var groups = require('./routes/groups'); 
 

 
var app = express(); 
 

 
app.use('/', routes); 
 
app.use('/users', users); 
 
app.use('/groups', groups); 
 

 
module.exports = app; 
 
app.listen(3000);

Тогда у меня есть еще один файл маршруты/users.js:

var express = require('express'); 
 
var router = express.Router(); 
 

 
/* GET users listing. */ 
 
router.get('/', function(req, res, next) { 
 
    res.send('GET ON THE users!'); 
 
}); 
 

 
module.exports = router;

И соседний г маршрут маршруты/groups.js:

var express = require('express'); 
 
var router = express.Router(); 
 
var otherRouter = require('./users') 
 

 
/* GET groups listing. */ 
 
router.get('/', function(req, res, next) { 
 

 
    // call the get on users and retrieve all data from that request 
 

 
    res.send('GET for the groups'); 
 
}); 
 

 
module.exports = router;

Спасибо! :)

+1

Просто возьмите код, определяющий, что ответ данных для маршрута '/ users', и поместите его в отдельную функцию. Затем вызовите эту функцию из обоих мест, которые вы хотите использовать. Если это асинхронно, тогда функция возвращает обещание, которое разрешается с данными. Затем вы можете использовать этот асинхронный интерфейс в обоих местах, в которых вы нуждаетесь. – jfriend00

+0

Вы должны были разместить его как фактический ответ. Я думал, что могу ссылаться на существующие маршруты, чтобы получить метод как-то. Спасибо за ваш ответ! :) – asuciu

+1

Я работаю над ответом на этот же вопрос, так как «вы не должны этого делать» ответ был недостаточно хорош для меня :) Вызов приложения напрямую (похоже на ответ «runMiddleware»/пример он, кроме как с mocks от https://www.npmjs.com/package/node-mocks-http), я чувствую, что создаст приятную возможность «внутреннего запуска». То есть, «app (mock_req, mock_res)», а затем исследует ответ. – ryanm

ответ

6

Вы не должны использовать для этого маршрутизацию. Просто вызовите функцию, отвечающую за извлечение пользователей из маршрута GET и сделайте то, что вам нужно с этими данными. То, как вы предлагаете, намного дороже, потому что вам нужно будет сделать http-вызов.

Для простоты я предполагаю, что ваша логика синхронные и данные, хранящиеся в данных/users.js:

var data = [{id:1, name: "one"},{id: 2, name: "two"}]; 
module.exports = function(){ 
    return data; 
}; 

в маршрутах/users.js:

var express = require('express'); 
var router = express.Router(); 
var getUsers = required('./../data/users'); 

router.get('/', function(req, res, next) { 
    res.send(getUsers()); 
}); 

в маршрутах/групп .js:

var express = require('express'); 
var router = express.Router(); 
var otherRouter = require('./users') 
var getUsers = require('./.../data/users'); 

router.get('/', function(req, res, next) { 
    var users = getUsers(); 
    //do some logic to get groups based on users variable value 
    res.send('GET for the groups'); 
}); 
+0

Это работает. Благодаря! : D Я думал, что могу на самом деле сделать прямой вызов метода get для маршрутизатора пользователей. Я не хочу открывать банку согревания, но это лучшая практика, когда вы выполняете промежуточное программное обеспечение, которое нужно вызывать методы маршрутов из других маршрутов? Еще раз спасибо за быстрый ответ. – asuciu

+0

Я рад, что смогу помочь. Пожалуйста, отметьте вопрос как ответ, если это предложение решило проблему. –

2

Вы можете использовать run-middleware модуль именно для этого

app.runMiddleware('/pathForRoute',{method:'post'},function(responseCode,body,headers){ 
    // Your code here 
}) 

Подробнее:

Раскрытие: Я сопровождающим & первым разработчиком этого модуля.

1

Я считаю, что объясняется «пересылка», и это весьма полезно и доступно в других рамках на других языках.

Кроме того, в качестве «форварда» он не имеет какие-либо накладные расходы из последующего ответа HTTP.

В случае экспресс-доставки в версии 4.X. Возможно, другие версии, но я не проверял.

var app = express() 

function myRoute(req, res, next) { 
    return res.send('ok') 
} 

function home(req, res, next) { 
    req.url = '/some/other/path' 

    // below is the code to handle the "forward". 
    // if we want to change the method: req.method = 'POST'   
    return app._router.handle(req, res, next) 
} 

app.get('/some/other/path', myRoute) 
app.get('/', home) 
Смежные вопросы