从何而来,从何而来

时间:2018-12-26 12:28:41

标签: node.js express

我正在关注一些与快递有关的教程。

作者在那里制作了一个中间件

function authCheck (req, res, next) {
  if (req.user) next() 
  else res.redirect("/somepath")
}

然后在API路由中,他像这样

router.get("/emailfetch", authCheck, async (req, res) => {

})

问题

所以我有三个问题。

第一名我们的authCheck功能可以完成三件事

  function authCheck (req, res, next) {

而且我看不到我们在get路由中间件中调用它们时传递了它们,因此它如何获得req, res, next

第二个。假设我制作了一个辅助函数文件 helper.js ,我们的helper.js是否可以访问req,res,next

第三次,他为什么不做 authCheck(),而是为什么他只是做 authCheck

2 个答案:

答案 0 :(得分:2)

1。 function authCheck (req, res, next):是中间件

这里

  • 要求用于请求对象
  • res 用于响应对象
  • next 是应用程序请求-响应周期中的中间件功能,它将控制权传递给下一个块

详细了解middleware

express提供用于传递中间件的语法,如下所示:

route.get('/your_route',yourMiddlewareFuntion,function(req,res){

});

因此您的中间件功能可以访问requestresponse对象。

2。是的,您可以在单独的文件中创建自定义中间件,然后在您的路由中使用它。

示例:您的helper.js类似于:

module.exports = function(req,res,next){
   // middleware logic goes here 
   // like check users is logged in or not 
  if(req.user){ 
     // user is logged in so able to access private route like dashboard
     next();
  }else{
     // redirect user to login page
     return res.redirect('/login');
  }
}

所以现在您定义

之类的路线
var checkAuth=require('./helper');

route.get('/dashboard',checkAuth,function(req,res){
    // user is logged in , find some data and display it 
    return res.render('/dashboard');
});
  

当您在浏览器中点击此路线/ dashboard时,请求将   首先通过checkAuth中间件,它检查您是否已登录或   否,如果您尚未登录,将被重定向到登录页面,   否则您的请求将传递到下一个块,即您的函数   / dashboard route,即会获取自定义数据并将其显示在   仪表板。

3。在上面的示例中,我们通过要求使用中间件功能并将其分配给checkAuth变量,因此这就是为什么我们使用checkAuth而不是checkAuth()

的原因

或者您可以在路由中直接使用function(req,res,next){}作为中间件

答案 1 :(得分:1)

1)Express使用next函数来移动到链中的下一个中间件。默认情况下,相同的reqresnext参数被传递到每个中间件,因此您可以简单地调用next()而不是通过next(req, res, next)显式传递参数。 。很少需要覆盖这些参数,但是这种类型的场景存在该机制。

2)只要将helper.js作为中间件传递,就可以。

3)中间件必须作为函数ref传递,因为Express随后会在内部调用它。在场景中,您可能会看到像func()这样的中间件,它会在内部返回与Express中间件签名匹配的函数,例如

function middleware() {
  return (req, res, next) => {
     ...
  }
}
...
router.get("/path", middleware(), ...

这种方法本身没有任何价值,但是在您希望将其他信息传递给中间件而不是依赖于全局变量的场景中很有用。