2016-11-24 7 views
0

У меня есть следующие маршруты определенывложенные маршруты в expressJS

router.get('/:company', function (req, res, next) { 
    // 1. call database and get company data 
    // 2. render company view 
}) 

router.get('/:company/employees', function (req, res, next) { 
    // 1. call database and get company data 
    // 2. call database and get employees data 
    // 3. render employees view 
}) 

Как объединить эти 2 маршрута, чтобы сделать только один вызов к базе данных, чтобы получить данные о компании. В принципе, я просто хочу повторить эту логику.

I'm ищет что-то вроде этого (проверено, но он не работает)

router.get('/:company', function (req, res, next) { 
    // 1. call database and get company data 
    // 2. render company view 

    router.get('/:company/employees', function (req, res, next) { 
     // no need to call database to get company data. we already have it 
     // 1. call database and get employees data 
     // 2. render employees view 
    }) 

}) 
+0

Вы не можете вкладывать маршруты. Это создает хаос. Сначала маршрут не активен до тех пор, пока сначала не пострадает родительский маршрут, а затем новый обработчик маршрута (и, следовательно, дублирующий обработчик маршрута) будет установлен каждый раз, когда пострадает родительский маршрут. Не могу так. Просто переместите общий код в общую функцию, которую вы можете вызывать из нескольких маршрутов. Забавно, как архитектура диспетчера маршрутов Express каким-то образом заставляет людей забывать о базовых принципах программирования, заключающихся в том, что общий код используется в общей функции, которую можно вызывать из нескольких мест. – jfriend00

+0

@ jfriend00 - «Смешно, как архитектура диспетчера маршрутов Express как-то заставляет людей забывать о базовых принципах программирования, заключающихся в том, что общий код используется в общей функции, которую можно вызывать из нескольких мест.» «: P – Rayon

+0

да смешно. ха-ха-ха. – handsome

ответ

3

имеют общую функцию, чтобы получить эти данные для вас. Держите маршруты отдельно!

function getCompanyData(input, cb) { 
    //DB operation 
    return cb(data); 
} 

function getEmployeeData(input, cb) { 
    //DB operation 
    return cb(data); 
} 
router.get('/:company', function(req, res, next) { 
    getCompanyData({ 
    data: data 
    }, function(err, data) { 
    //reder view 
    }); 
}) 

router.get('/:company/employees', function(req, res, next) { 
    getCompanyData({ 
    data: data 
    }, function(err, data) { 
    if (!err) { 
     getEmployeeData({ 
     data: data 
     }, function(err, data) { 
     //reder view 
     }) 
    } 
    }); 
}) 
+0

Я предлагаю использовать модуль 'async' при работе с несколькими асинхронными вызовами в одной функции и особенно с методом' waterfall'. http://caolan.github.io/async/docs.html#waterfall – mxncson

+0

@mxncson - Я бы сказал, что это «зависит». Я бы избегал «async» для такого незначительного случая использования. – Rayon

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