Есть ли способ избежать множественного следующего () в промежуточном ПО Express - PullRequest
0 голосов
/ 20 марта 2019

Вот как я спроектировал свой маршрут, и я не очень доволен им. Я бы предпочел разбить каждый hasValid на собственное промежуточное ПО, но я не понимаю, как это будет работать, поскольку не остановит выполнение.

const secretSender = async (req, res, next) => {
  if (!hasValidA(req)) {
    return next()
  }

  if (!hasValidB(req)) {
    return next()
  }

  if (!hasValidC(req)) {
    return next()
  }

  if (!hasValidD(req)) {
    return next()
  }

  res.send('something secret')
}

router.use(secretSender)
router.get('*', (req, res) => {
  res.send('something public')
})

Также не имеет смысла делать маршрут по умолчанию «чем-то секретным» и иметь «что-то общедоступное» в качестве промежуточного программного обеспечения, поскольку «что-то общедоступное» является поведением по умолчанию.

1 Ответ

1 голос
/ 20 марта 2019

Вот один из способов разбить каждый hasValid на свое промежуточное ПО.Каждое промежуточное ПО будет закорачивать выполнение, если результат действителен :

const validA = async (req, res, next) => {
  if (hasValidA(req)) {
    res.send('something secret') 
  } else {
    next()
  }
}

const validB = async (req, res, next) => {
  if (hasValidB(req)) {
    res.send('something secret')
  } else {
    next()
  }
}

const validC = async (req, res, next) => {
  if (hasValidC(req)) {
    res.send('something secret') 
  } else {
    next()
  }
}

const validD = async (req, res, next) => {
  if (hasValidD(req)) {
    res.send('something secret')
  } else {
    next()
  }
}

router.use(validA, validB, validC, validD)
router.get('*', (req, res) => {
  res.send('something public')
})

Обновление

Для достижения некоторого подобного результатас кодом ОП, но только с одним next():

const secretSender = async (req, res, next) => {
  if (hasValidA(req) && hasValidB(req) && hasValidC(req) && hasValidD(req)) {
    res.send('something secret')
  } else {
    next()
  }
}

router.use(secretSender)
router.get('*', (req, res) => {
  res.send('something public')
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...