Jag*_*Jag 1 redis node.js node-redis
我正在尝试使用node_redis从node.js使用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
});
}
Run Code Online (Sandbox Code Playgroud)
但是调用client.ZINTERSTORE会抛出错误:[错误:错误语法错误].将标记作为数组传递(而不是使用tags.join(''))会引发相同的错误.
我在哪里可以找到此命令的正确语法?node_redis的源代码将它隐藏在javascript解析器中,但是如果没有"单步执行"代码,看看会发生什么是很棘手的.是否有一种很好的方法可以通过node.js进行调试?
有多种方法可以使用node.js调试Redis客户端.
首先,您可以依赖Redis监视器功能来记录Redis服务器接收的每个命令:
> 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"
Run Code Online (Sandbox Code Playgroud)
您可以看到Redis收到的zinterstore命令格式不正确.
然后,您可以通过在脚本中添加以下行来激活node_redis的调试模式:
redis.debug_mode = true;
Run Code Online (Sandbox Code Playgroud)
它将在运行时输出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
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用node.js调试器.以下列方式在代码中放置调试器断点:
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')
});
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以在调试模式下使用节点启动脚本:
$ 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 ...
Run Code Online (Sandbox Code Playgroud)
通过逐步执行代码,您将意识到命令数组不正确,因为标记被序列化并作为唯一参数处理.
如下更改代码将解决问题:
var cmd = [ "tmp", tags.length ];
client.zinterstore( cmd.concat(tags), function(err, replies) {
...
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
714 次 |
| 最近记录: |