控制流的返回如何在Express中间件函数链中起作用?

时间:2017-06-06 19:25:36

标签: express routing middleware

我实际上有几个关于Express中间件链接的问题,并且认为我会将它们分组在这一篇文章中,因为它们密切相关。

Q1:在中间件函数中,如果我send() Response,传递给下一个函数,或者只是返回,是否会执行剩余的任何代码?

router.get('/a', (req, res, next) => {
    res.sendStatus(200);
    // Does this ever get executed?
}); 

router.get('/b', (req, res, next) => {
    next();
    // Does this ever get executed?
}); 

router.get('/c', (req, res, next) => {
    return;
    // Does this stop the middleware chain? What happens to the request/response?
});

Q2:你可以从前一个中传到另一个中间件函数吗?我的理由是我必须提供一个参数来创建某个中间件,该参数取决于哪个Express app对象是Request的所有者。所以我需要访问Request的属性,然后才能将其传递给需要使用该属性创建的中间件。这会有用吗??

router.get('/d', (req, res, next) => {
    var middlewareFunction = createDynamicMiddleware();
    middlewareFunction(req, res, next); // Will this still work as expected?
});

问题3:当您在没有任何参数的情况下调用Request时,Response / next()参数如何传递给下一个中间件?

1 个答案:

答案 0 :(得分:0)

  

Q1 :在中间件函数中,如果我发送()响应,传递给下一个函数,或者只是返回,其余任何代码都会得到   执行?

router.get('/a', (req, res, next) => {
    res.sendStatus(200);
    // Does this ever get executed?
    //    Yes, but don't call next() or res.send() or it will throw an error

}); 

router.get('/b', (req, res, next) => {
    next();
    // Does this ever get executed?
    //    Yes, but don't call next() or res.send() or it will throw an error

}); 

router.get('/c', (req, res, next) => {
    return;
    // Does this stop the middleware chain? What happens to the request/response?
    //    The request get stuck and after a while it will fail due 'timeout'
});
  

Q2 :您可以从前一个中传到另一个中间件功能吗?我的理由是我必须提供一个   创建某个中间件的参数,那个参数是   取决于哪个Express应用程序对象是请求的所有者。所以   我需要在将Request传递给之前访问Request的属性   需要使用该属性创建的中间件。

您的动态中间件工厂应该返回一个新功能

返回新函数的函数也称为curried函数,这是一个实际的例子:

// based on 'someId' we will return a specific middleware

req.get('/user/:someId', 
 createDynamicMiddleware,
 (req,res) => { 
  res.send('ok') 
 })

function createDynamicMiddleware(req,res,next){
  if(req.params.someId === 'me') {
    return function(req, res, next){
     // do some stuff if someId is me
     return next();
    }
  } else {
    return function(req, res, next){
     // do some other stuff otherwise
     return next();
    }
  }
}
  

Q3 :在没有任何参数的情况下调用next()时,请求/响应参数如何传递给下一个中间件?

快递处理这个给你!

此外,如果向req或res对象添加属性,它将出现在下一个中间件中

例如:

router.get('/', (req,res,next) => {
  req.customProperty = 'hello!';
  return next();
}, (req, res) => {
  console.log(req.myCustomProperty)
  // hello!
})