【问题标题】:Socket.io User Sessions With Redis and JWT使用 Redis 和 JWT 的 Socket.io 用户会话
【发布时间】:2017-07-09 17:54:02
【问题描述】:

谁能帮我理解这部分代码:

  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 文档并阅读了有关“包装”方法的信息。我很困惑,特别是因为我看不到在文章中进一步使用了这个'auth'! (我认为这毕竟被定义为在某处使用)。 提前谢谢你。

【问题讨论】:

    标签: express redis socket.io


    【解决方案1】:

    所以,让我们分解一下。首先,我们将一个带有cb 参数的函数分配给auth。该函数是做什么的,嗯,它返回_.wrap 的结果。查看文档,_.wrap 是一个柯里化函数,因此它需要一个 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,最后使用传入的 data 调用原始 cb 回调参数。

    我不确定它在代码中的位置,但想法是您可以将其称为:

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

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

    【讨论】:

    • 谢谢!您能否解释一下“它需要一个 arg (cb) 和一个函数,并返回一个新函数,其中第一个参数绑定到 arg,其余参数未绑定”更多?或者如果可能的话,给我举个例子?走近了,其实你的大部分回复我都明白了,特别是最后的想法(因为明确指定了),但是还是不明白为什么定义了这个“var auth”,却从来没有使用过!如果您也没有看到它,我将其保留为“可能是文章中的错误”。现在大体思路很清楚了。
    • 所以在那篇文章的示例代码中,与 auth 函数相同的代码块,第 24 行开始使用它。希望有帮助
    • 那篇文章中我唯一没有读过的东西!习惯了socket.on(...),我就跳过了,错过了使用auth,这就提出了问题,谢谢,终于明白了!
    猜你喜欢
    • 1970-01-01
    • 2014-12-23
    • 2012-05-03
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 2011-09-07
    • 1970-01-01
    相关资源
    最近更新 更多