Самый простой способ добавить промежуточное ПО на единый маршрут Js Express - PullRequest
2 голосов
/ 07 марта 2019

Мне интересно, делаю ли я это самым чистым способом. Вот мои настройки:

Files
  - app.js
  - routes.js
  - controllers
    - wallet.js

routes.js

const router = require('express').Router()
const wallet = require('./controllers/wallet')

router.post('/wallet/generate', wallet.generate)
router.get('/wallet/address', wallet.address)
router.get('/wallet/balance', wallet.balance)
router.post('/wallet/transfer', wallet.transfer)

module.exports = router

controllers/wallet.js

const generate = async (req, res) => {
  // ...
}

const address = async (req, res) => {
  // ...
}

const balance = async (req, res) => {
  // ...
}

const _transfer = async (req, res) => {
  // ...
}

const transfer = [
  // I put my subroute specific middlewares here
  handleInvalidAddress,
  handleInvalidAmount,
  handleInvalidTokenName,
  _transfer
]

module.exports = {transfer, generate, address, balance}

Это приемлемый способ сделать это? Я не смог найти хороших примеров экспресс-приложений с открытым исходным кодом, которые мог бы смоделировать. Мне кажется, что указывать мои небольшие промежуточные программы только для одного маршрута в файле routes.js было бы неправильно. Вся логика находится в папке контроллеров, а промежуточное ПО - логика.

edit: the transfer middlewares Их вряд ли можно использовать где-либо еще, кроме маршрута перевода кошелька. В реальной жизни они больше и не должны загромождать функцию маршрута передачи

const handleInvalidAddress = (req, res, next) => {
  if (req.body.address) {
    return next()
  }
  res.status(400).send('invalid address')
}

const handleInvalidAmount = (req, res, next) => {
  if (req.body.amount) {
    return next()
  }
  res.status(400).send('invalid amount')
}

const handleInvalidTokenName = (req, res, next) => {
  if (req.body.tokenName) {
    return next()
  }
  res.status(400).send('invalid token name')
}

1 Ответ

0 голосов
/ 07 марта 2019

Это хороший рецепт для определения нового маршрутизатора, как показано выше.Если промежуточное программное обеспечение и функции обработчика маршрутов не используются повторно, их можно использовать на месте.Он не должен знать о wallet части, потому что он является общим для всех маршрутов:

const router = require('express').Router()

router.post('/generate', async (req, res) => {...})
router.get('/address', async (req, res) => {...})
router.get('/balance', async (req, res) => {...})


router.use('/transfer', function handleInvalidAddress(req, res, next) {...})
router.post('/transfer', async (req, res) => {...})

module.exports = router;

И монтировать его следующим образом:

const walletRouter = require('./routes/wallet')        
appRouter.use('/wallet', walletRouter);

В случае wallet маршрутов нужноПо какой-то причине для распределения между несколькими модулями (например, системой плагинов) может быть полезно использовать внедрение зависимостей:

module.exports = router => {
    router.post('/generate', async (req, res) => {...})
    router.get('/address', async (req, res) => {...})
    router.get('/balance', async (req, res) => {...})

    router.use('/transfer', function handleInvalidAddress(req, res, next) {...})
    router.post('/transfer', async (req, res) => {...})
};

и монтировать его следующим образом:

const walletRouter = Router();
require('./routes/wallet')(walletRouter);
appRouter.use('/wallet', walletRouter);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...