是否可以看到与socket.io捆绑在一起的redis模块内部

时间:2013-01-30 03:41:22

标签: node.js redis socket.io

因为我们可以配置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并连接使用redis作为MemoryStore,但是我没有看到任何与socket.io有关的内容。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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

基本node.js Passport会话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.

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

现在,有三种方法可以在调试模式下运行node.js代码。在首次运行node-inspector之后执行此操作:

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'在明文应用程序上运行正常,你可能只需要点击一个端点或做一些事务或者告诉它手动暂停在断点处。

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

您还可以将'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。

如果您尝试监视正在使用群集并创建多个节点进程的应用程序,那么如果您尝试在节点中进行调试< 0.11.x你会看到socket的这个问题:

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

在unstable节点版本中,child_process.fork命令侦听调试器端口5858 + 1,所以59,60等,具体取决于您拥有的工作程序。

现在,在节点0.10.x中,如果需要检查群集应用程序中的worker的状态,则必须以“--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

它将启动节点检查器,将Web浏览器打开到适当的检查器,并在最新的节点版本中 - 它了解群集。