ZINTERSTORE与node_redis的dynamic参数

我试图从node.js使用node_redis使用redis的ZINTERSTORE命令:

//node.js server code var redis = require("redis"); var client = redis.createClient(); // ... omitted code ... exports.searchImages = function(tags, page, callback){ //tags = ["red", "round"] client.ZINTERSTORE("tmp", tags.length, tags.join(' '), function(err, replies){ //do something }); } 

但是,调用client.ZINTERSTORE抛出错误:[错误:ERR语法错误]。 将标签作为数组传递(而不是使用tags.join(''))会引发相同的错误。

我在哪里可以find这个命令的正确语法? node_redis的源代码将其隐藏在JavaScriptparsing器中,但是如果没有“遍历”代码,就很难看到发生了什么。 有没有一种好的方法来通过node.js进行debugging?

有多种方法可以用node.js来debuggingRedis客户端。

首先,您可以依靠Redis监视器functionloggingRedis服务器收到的每个命令:

 > src/redis-cli monitor OK 1371134499.182304 [0 172.16.222.72:51510] "info" 1371134499.185190 [0 172.16.222.72:51510] "zinterstore" "tmp" "2" "red,round" 

您可以看到Redis收到的zinterstore命令不正确。

然后,您可以通过在脚本中添加以下行来激活node_redis的debugging模式:

 redis.debug_mode = true; 

它将在运行时输出Redis协议:

 Sending offline command: zinterstore send ncegcolnx243:6379 id 1: *4 $11 zinterstore $3 tmp $1 2 $9 red,round send_command buffered_writes: 0 should_buffer: false net read ncegcolnx243:6379 id 1: -ERR syntax error 

然后,你可以使用node.jsdebugging器 。 以下面的方式在代码中放置一个debugging器断点:

 function search(tags, page, callback) { debugger; // breakpoint is here client.ZINTERSTORE("tmp", tags.length, tags, function(err, replies){ console.log(err); console.log(replies); callback('ok') }); } 

然后可以在debugging模式下使用节点启动脚本:

 $ node debug test.js < debugger listening on port 5858 connecting... ok break in D:\Data\NodeTest\test.js:1 1 var redis = require("redis"); 2 var client = redis.createClient( 6379, "ncegcolnx243" ); 3 debug> help Commands: run (r), cont (c), next (n), step (s), out (o), backtrace (bt), setBreakpoint (sb), clearBreakpoint (cb), watch, unwatch, watchers, repl, restart, kill, list, scripts, breakOnException, breakpoints, version debug> cont break in D:\Data\NodeTest\test.js:8 6 function search(tags, page, callback) { 7 8 debugger; 9 client.ZINTERSTORE("tmp", tags.length, tags, function(err, replies){ 10 console.log(err); ... use n(ext) and s(tep) commands ... 

通过单步执行代码,您将意识到命令数组不正确,因为标记被序列化并作为唯一参数处理。

如下更改代码将解决问题:

 var cmd = [ "tmp", tags.length ]; client.zinterstore( cmd.concat(tags), function(err, replies) { ... });