javascript 做 passport nodejs 时的语法

javascript syntax while doing passport nodejs

我对 javascript 语法有疑问。实际上,我在自学 MEAN 堆栈教程 (https://thinkster.io/mean-stack-tutorial#adding-authentication-via-passport) 时想到了编码。下面有一个很奇怪的编码。

})(req, res, next);

(req, res, next) 似乎是参数,但没有函数利用该参数。也许我现在还不够聪明,所以我看不到它。 有没有人可以帮我解决这个问题?谢谢

router.post('/login', function(req, res, next){
 if(!req.body.username || !req.body.password){
  return res.status(400).json({message: 'Please fill out all fields'});
 }

 passport.authenticate('local', function(err, user, info){
  if(err){ return next(err); }

  if(user){
   return res.json({token: user.generateJWT()});
  } else {
   return res.status(401).json(info);
  }
 })(req, res, next);
});

要了解发生了什么,您应该知道 Express 中的 "middleware" 是什么。这是一个可以传递给 Express 的函数,它传递了一个请求对象、一个响应对象和一个下一个函数:

function middleware(req, res, next) {
...
}

使用中间件,您可以"tap"进入 HTTP 请求通过 Express 应用程序的路径,并执行某些操作。

您可能已经注意到中间件函数签名看起来很像您的示例代码:

router.post('/login', function(req, res, next) { ... });

这是一个路由处理程序,为 POST/login 的请求调用。路由处理程序类似于中间件,因为它们使用相同的参数调用并执行某些操作(通常,next 不在路由处理程序中使用,但它仍将作为参数传递)。

您也可以 "stack" 中间件:

router.post('/login',
    function (req, res, next) { ... }, // first middleware
    function (req, res, next) { ... }, // second middleware
    ...
);

这就是 next 发挥作用的地方:如果第一个中间件对请求不感兴趣,它可以调用 next(这是一个函数)并将请求传递给第二个中间件(如果该中间件对其不感兴趣,它也可以调用 next,将请求传递给应用程序中的所有中间件,直到中间件处理该请求或失败,生成 404 错误,因为没有找到可以处理请求的中间件)。

passport.authenticate() 也是 return 一个中间件函数。通常这样使用:

router.post('/login',
  passport.authenticate(...),
  function (req, res, next) { ... }
);

这意味着,如果您查看堆叠示例,passport.authenticate() 应该 return 一个接受三个参数的函数 reqresnext(事实上,确实如此)。

也就是说上面的代码可以重写为:

router.post('/login', function(req, res, next) {
  passport.authenticate(...)(req, res, next);
});

这与您问题中的代码相匹配。 为什么 你想打电话给 passport.authenticate() 这样的是一个相对高级的 Passport 主题。

编辑:这就是passport.authentication,从广义上讲,看起来像:

// a function that mimics what `passport.authenticate` does:
function myAuthenticate() {
  return function (req, res, next) {
    ...some stuff...
    next();
  };
}

这是一个函数 ,return 是一个函数。你可以这样使用它:

router.post('/login',
  myAuthenticate(),
  function (req, res, next) {
    ...
  }
);

这(几乎)与此相同:

router.post('/login',
  function(req, res, next) { // <-- this is the function that got returned!
    ...some stuff...
    next();
  },
  function(req, res, next) {
    ...
  }
);