Существует несколько способов отладки клиента Redis с помощью node.js.
Во-первых, вы можете положиться на функцию монитора 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"
Вы можете видеть, что команда zinterstore, полученная Redis, имеет неправильный формат.
Затем вы можете активировать режим отладки node_redis, добавив следующую строку в свой скрипт:
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.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')
});
}
Затем вы можете запустить скрипт с узлом в режиме отладки:
$ 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) {
...
});
person
Didier Spezia
schedule
13.06.2013