有没有一种方法可以避免在快速中间件中使用多个next()

时间:2019-03-20 03:44:51

标签: node.js express

这是我设计路线的方式,对此我并不满意。我希望能够将每个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 个答案:

答案 0 :(得分:1)

这是将每个hasValid分解成自己的中间件的一种方法。如果结果为 valid

,则每个中间件都会使执行过程短路:
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')
})

更新

要使用OP的代码获得某种相似的结果,但只能使用单个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')
})