0

因为我们可以将 socket.io 配置为使用 redis 来实现它的内部工作,如下所示:

var RedisStore = require('socket.io/lib/stores/redis')
, redis  = require('socket.io/node_modules/redis')
, pub    = redis.createClient()
, sub    = redis.createClient()
, client = redis.createClient();

io.set('store', new RedisStore({
  redisPub : pub
, redisSub : sub
, redisClient : client
}));

怎么可能看到这个 RedisStore 的内部来查看 socket.io 正在插入和删除什么数据。我将我的 socket.io 配置设置为使用从 node-redis 安装的 redis 实例,如下所示:

redis  = require('redis')

但我没有看到任何 socket.io 活动正在进行,我想知道 socket.io 是否真的在使用 redis。我确实看到我的 cookie 存储在 redis 中,因为我将 express 和 connect 配置为使用 redis 作为 MemoryStore,但我没有看到任何与 socket.io 相关的内容。

4

1 回答 1

1

对于本地 redis node.js 开发/调试,我这样做。

在后台启动 redis 服务器并在同一个 tty 中运行 cli 监视器:

redis-server &
redis-cli monitor -h host -p port   

如果使用本地默认值,您可以离开-关闭。

您还可以运行一个 redis 从站,它回显所有主命令并将当前 redis-server 的内存保存的数据同步到默认为 ./dump.rdb 的文本文件中。该文件可以加载到 redis 并使用文本编辑器查看。

 redis-cli --slave -h host -p port
 vim ./dump.rdb

一个基本的 node.js Passport session-cookie 看起来像这样:

sess:L2C4MPtAUmlO4zHGkXnq4icuÃ@U@Z{"cookie":{"originalMaxAg  null,"expiresÀhttpOnly":true,"path":"/"}passport L}

为了进一步帮助您了解内部情况,您可能需要单步执行您的应用程序并在节点代码和 redis 驱动程序交互的区域放置断点。

您可以使用它来观察握手过程,通过单步执行您的函数并观察控制流期间的状态变化来查看不正确的数据交换、套接字问题等。

此作业的节点应用程序是节点检查器。

它将允许您在类似于 Chrome 开发工具的调试环境中查看您的应用程序运行,您可以在其中设置断点以暂停、步入和退出功能,并及时向前移动,直到下一个断点或异常触发暂停。

npm -g install node-inspector

当您在多个项目中使用它时,您可以使用“-g”全局开关安装它。

在终端窗口中运行没有任何选项的程序会为我生成以下输出:

~/passaic-streaming git:weekend-refactor ❯❯❯
Node Inspector v0.7.0
Visit http://localhost:8080/debug?port=5858 to start debugging.

您可以使用配置或 ENV 变量配置 HOST、PORT、DEBUG-PORT(DEBUG_PORT,端口 5858,作为参数传递,在运行的节点进程和运行 Web 应用程序的浏览器之间设置套接字连接)。

现在,有三种方法可以在调试模式下运行你的 node.js 代码。在第一次运行节点检查器后执行此操作:

node --debug-brk app.js

node --debug app.js

node app.js  // then send a SIGUSR1 to the node process:

// pgrep node
// kill -s USR1 PID

使用第一个命令“--debug-brk”,直到一切正常,因为它告诉您的代码在模块的第一行停止。

    browser http://localhost:8080/debug?port=5858

根据您的应用程序大小,加载可能需要一些时间。但是一旦在那里,您将有一个源选项卡来逐步执行代码,以及一个控制台选项卡。

'--debug' 可以在 express 应用程序上正常工作,您可能只需要点击端点或执行一些事务或告诉它手动在断点处暂停。

一些节点脚本太快而无法被节点检查器侦听器捕获,并且在您在源代码中设置断点之前,可以方便地在第一行中断,因此命令。

您还可以'node debugger';在以下区域周围放置线条:

 // connect to Redis for sessionStore

  node debugger;    // node-inspector will pause here.

  redisClient = redis.createClient(
    options.PORT, options.HOST, options.REDIS_OPTIONS));

您可能需要使用 SIGUSR1 而不是在调试模式下启动应用程序的主要原因是您使用的是 node.js 集群 API。

如果您尝试监视使用集群并创建多个节点进程的应用程序,那么如果您尝试在 node < 0.11.x 中进行调试,您将看到套接字存在以下问题:

Failed to open socket on port 5858, waiting 1000 ms before retrying
Failed to open socket on port 5858, waiting 1000 ms before retrying

在不稳定的节点版本中,child_process.fork 命令在调试器端口 5858+1 上进行侦听,例如 59、60 等,具体取决于您拥有的工作人员。

目前在节点 0.10.x 中,如果您需要检查集群应用程序中工作人员的状态,您必须启动节点而不是“--debug”模式,而是将 kill USR1 信号发送到进程。

要使用 redis 强制更多地注销节点,请将您的 node_redis 驱动程序置于调试模式:

redis = require('redis');
redis.debug_mode = true; //turn on debug mode

另外,如果您像这样开始使用 connect-redis 中间件:

DEBUG=* node app.js

然后你会看到这样的 connect-redis 输出:

connect:redis SETEX "sess:FVDBpNoFDFIOkynFDLcpM6St" ttl:604799 
{"cookie":{"originalMaxAge":604799991,"expires":"2014-03-08T22:38:32.620Z","httpOnly":true,"path":"/"},"passport":{"user":"52edfdfdf3da2rer0c06eb34"}} +50ms

最后,StrongOps/Strongloop 的团队加入了他们的命令行工具节点检查器的一部分。

npm install -g strong-cli

slc debug app.js

它将启动节点检查器,打开网络浏览器到适当的检查器,并且在最新的节点版本中——它理解集群。

于 2014-03-01T22:33:43.200 回答