理解 node.js 回调结构

Posted

技术标签:

【中文标题】理解 node.js 回调结构【英文标题】:understanding node.js callback structure 【发布时间】:2012-11-27 03:59:52 【问题描述】:

我正在研究非常简单的 node.js 项目,以更好地了解它的回调功能。

假设我在这里有一个像这样的登录“系统”:

if( req.query["username"] == "john" && req.query["password"] == "smith" )   
    req.session.gatekeeper = req.query["username"];
    res.end( "succesfully logged in" );
 else  res.end( "wrong username or password" ); 

到目前为止,很容易。现在假设我不是简单地拥有“john:smith”,而是将它存储在 redis 上。使用 php 我会这样做:

if( $r->get("$usernameIn") == $passwordIn ) 
  $_SESSION['gatekeeper'] = $usernameIn;
  echo "succesfully logged in";

但是现在,通过查看 node 的 redis 文档 (https://github.com/mranney/node_redis/),我看到 get 命令是这样的:

client.get("foo", function(err, reply) 
    console.log(reply);
);

理解如何“构建”我提供的第一个代码和最后一个代码对我来说真的很复杂。

有什么帮助吗?提前致谢。

【问题讨论】:

你希望你的 redis 查询如何适应你的第一个代码?你在(或打算)foo 提供什么价值? 是的。在“foo”我想把 req.query["username"] 在redis中那个key引用的值中 【参考方案1】:

node.js 中的几乎所有内容都是异步的。所以,几乎每一个被调用的方法,你都必须指定一个回调方法来处理方法调用的结果。通常,回调函数有两个参数:error、result。因此,由您来检查错误然后处理结果。还有其他节点模块可以使用更简洁的代码 (node promises),但这超出了您的问题的范围。

作为免责声明,我以前没有使用过 redis,所以我下面的代码示例基于您上面的代码示例和redis node.js 模块的快速概述。

var redis = require("redis"),
    client = redis.createClient();

client.on("connect", function () 
    client.get(userName, function(err,returnedPassword)

      if(password === returnedPassword) 
        req.session.gatekeeper = req.query["username"];
        res.end( "succesfully logged in" );
       else 
        res.end( "wrong username or password" );
      
   );
);

【讨论】:

酷,谢谢!进入这种异步状态仍然有点困难,来自 php.ini。无论如何,你应该看看 redis,它就像 node.js 的面包和黄油 就个人而言,我认为当您连续有多个回调时,回调有点难以阅读。我真的很喜欢承诺。我通常使用github.com/kriszyp/node-promise。这里是 *** 人谈论他们的链接:***.com/questions/4296505/…

以上是关于理解 node.js 回调结构的主要内容,如果未能解决你的问题,请参考以下文章

深入理解Node.js基于事件驱动的回调

Node.js - 为啥我的一些回调没有异步执行?

node.js 中回调函数callback(转载),说的很清楚,看一遍就理解了

Promise 与 q 框架和 Node.js 中的回调模式?

Node.js 和数据库变量中的回调 [重复]

Node.js&Promise的新理解&记一次异步编程的错误尝试