这是结束nodejs / express中间件中的请求-响应周期的正确方法吗?

时间:2019-11-12 06:50:55

标签: node.js express

我在nodejs / express项目中有一个中间件功能docker-compose,用于检查提交的auth_deviceid。如果device_id不满足特定条件,则应终止请求-响应周期。我想知道我的代码是否正确以结束请求-响应周期。这是device_id

auth_deviceid

上面的中间件函数在路由中被调用:

module.exports = function(req, res, next) {
    const user_device_id = (req.query._device_id || req.body._device_id);
    if (!user_device_id || user_device_id.length < 10) return res.status(400).send('Missing device id!');

    next();
}

我的问题是,如果router.post('/verif', [auth_deviceid], async (req, res) => {....} 为空,上面的router.post是否会被拒绝(user_device_id返回false)?

2 个答案:

答案 0 :(得分:1)

我们看起来不错,如果不满足条件,您将通过res.send()返回,该内部调用res.end()

答案 1 :(得分:1)

让我们res.send而不是在中间件中调用next,然后通过一个错误处理程序处理所有错误。

中间件

module.exports = function(req, res, next) {
    const user_device_id = (req.query._device_id || req.body._device_id);
    if (!user_device_id || user_device_id.length < 10) return next(new Error('MISSING_DEVICE_ID'));
    // I like a custom error like `new MissingDeviceError()`

    next();
}

然后,在您的express app错误处理程序中,只需检查错误类型:

app.use(function (err, req, res, next) {
  console.error(err.stack)
  if (err.message === 'MISSING_DEVICE_ID') {
    return res.status(400).send('Missing device id!');
  }
  // another error
  res.status(500).send('Something broke!')
})