Как структурировать несколько почтовых конечных точек с помощью узла / express. js - PullRequest
0 голосов
/ 08 апреля 2020

Как я могу успешно настроить мои маршруты для доступа к нескольким методам на моем контроллере в соответствии с конечной точкой и параметрами, переданными в URL?

При доступе к / companies /: companyId / createCheques я хотел бы вызвать метод createCheques в контроллере проверок, но он все еще вызывает createCheque.

Я попытался добавить следующую строку в маршруты / проверки. js, но это не сработало.

router.route('/:companyId/createCheques').post(createCheques)

// routes/companies.js
const express = require('express')

const {
    getCompanies,
    getCompany,
    deleteCompany,
    createCompany,
    updateCompany,
} = require('../controllers/companies')

// Include other resource routers 
const userRouter = require('./users')
const chequeRouter = require('./cheques')
const redeemRouter = require('./redeems')

const router = express.Router({ mergeParams: true })

// Re-route into another resources routers
router.use('/:companyId/users', userRouter)
router.use('/:companyId/cheques', chequeRouter)
router.use('/:companyId/createCheques', chequeRouter)
router.use('/:companyId/redeems', redeemRouter)


router
    .route('/')
    .get(getCompanies)
    .post(createCompany)

router
    .route('/:id')
    .get(getCompany)
    .put(updateCompany)
    .delete(deleteCompany)


module.exports = router;

// routes/cheques.js
const express = require('express')

const {
    getCheques,
    getCheque,
    deleteCheque,
    createCheque,
    createCheques,
    updateCheque
} = require('../controllers/cheques')

// when more than 1 url param is possible to the same route, mergeParams must to be set to true
const router = express.Router({ mergeParams: true })

// Advanced results 
const Cheque = require('../models/Cheque')
const advancedResults = require('../middleware/advancedResults')


router
    .route('/')
    .get(advancedResults(Cheque, 'cheques'), getCheques)
    .post(createCheque)
    .post(createCheques)


router
    .route('/:id')
    .get(getCheque)
    .put(updateCheque)
    .delete(deleteCheque)


module.exports = router;

1 Ответ

0 голосов
/ 11 апреля 2020

Проблема в том, что вы определяете два контроллера POST для одного и того же маршрута.

Если вы хотите вызвать оба контроллера createCheque и createCheques, когда POST установлен на :companyId/createCheques/, вам нужно только добавить next() в последнюю строку createCheque, как промежуточное ПО. См. https://expressjs.com/es/4x/api.html#router

Если вы хотите вызвать только один контроллер, вам нужно создать отдельный маршрут для другого контроллера на ваших маршрутах / проверках. js файл.

router
 .route('/cheques') //here the complete path would be companyId/createCheques/cheques
 .post(createCheques)
...