Redis和JWT的Socket.io用户会话

时间:2017-07-09 17:54:02

标签: express redis socket.io

有人可以帮我理解这部分代码:

  var auth = function(cb) {
return _.wrap(cb, function(fn, data) {
  redis.get(email, function(err, id){
    if (!err) throw err;
    if (!id) return socket.disconnect('unauthorized');
    fn(data);
   });
 });
};

我是从article获得的。

我不明白那里发生了什么,即使我导航到lodash文档并阅读'wrap'方法。我很困惑,特别是因为我无法看到文章中的'auth'被进一步使用! (我认为这被定义为毕竟用于某处)。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

所以,让我们打破它。首先,我们正在分配一个将cb参数带到auth的函数。该函数做了什么,它返回_.wrap的结果。查看文档,_.wrap是一个currying函数,因此它需要一个arg(cb)和一个函数,并返回一个新函数,其中第一个参数绑定到arg,其余部分参数未绑定。事实上,_.wrap部分:

return _.wrap(cb, function(fn, data) {
  /* code */
  fn(data); // inside of the redis scope
})

可能有点矫枉过正,因为你处于外部函数的闭包中,所以你可以这样做:

return function(data) {
  /* code */
  cb(data) // in the redis callbak scope, but that is still in the closed over scope
}

老实说,我不确定他们为什么不这样做(锤子/钉子?)。

让我们继续。

因此,我们确定auth是一个函数,它接受cb参数并返回一个带data参数的函数。该函数现在调用redis.get来查找与email中存储的密钥相关联的值(从周围范围拉入)。然后它调用传入的回调函数(采用err和id的函数)验证参数(如果电子邮件没有在redis中关联,则断开websocket,最后使用传入的cb回调调用原始data回调。 {1}}参数。

我不确定它在代码中的用途,但我们的想法是你可以把它称为:

let authCb = auth((data) => { console.log(data) })
authCb('test')

如果在redis中找到电子邮件,则应将test记录到控制台。在本文的上下文中,您将在实际开始与套接字通信之前使用它来验证连接(在cb函数中)