做 Passport nodejs时的javascript语法

标签 javascript node.js passport.js

我有一个关于 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 中的“中间件”是什么。这是一个可以传递给 Express 的函数,它会传递一个请求对象、一个响应对象和一个下一个函数:

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

使用中间件,您可以“利用”HTTP 请求通过 Express 应用程序所遵循的路径,并执行某些操作。

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

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

这是一个路由处理程序,针对发送到 /loginPOST 请求而调用。路由处理程序与中间件类似,因为它们使用相同的参数进行调用,并且还执行某些操作(通常,next 不会在路由处理程序中使用,但它仍然会作为参数传递) .

您也可以“堆叠”中间件:

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

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

passport.authenticate() 还返回一个中间件函数。通常这样使用:

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

这意味着,如果您查看堆栈示例,passport.authenticate() 应该返回一个接受三个参数 reqres 的函数code> 和 next (事实上,确实如此)。

这意味着上面的代码可以重写为:

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();
  };
}

这是一个返回函数的函数。您可以像这样使用它:

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) {
    ...
  }
);

关于做 Passport nodejs时的javascript语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38085927/

相关文章:

javascript - 动态属性的外部

javascript - JS Promises - 链结束在链步骤之前返回

node.js - 使用 Passport 对 Facebook 进行身份验证不起作用

javascript - NodeJS + Passport,检索访问 token (Spotify API)

javascript - 希望 Passport 存储 req.client 而不是 req.user 以实现承载策略

javascript - 为什么这个 javascript 计时器代码在 Chrome 调试器中可以工作,但在正常运行时却不能工作

javascript - iOS Safari javascript 录音

javascript - 尝试使用 onclick 调用函数时未定义值

node.js - 在 Postgres Node.js 应用程序中将 createAt 和 updatedAt 存储为纪元 unix 时间戳而不是 Date?

javascript - 为白板应用程序发送一个大数据包还是许多较小的数据包?