node.js экспресс — попытка выполнения команды redis MULTI / EXEC

#javascript #node.js #express #redis

#javascript #node.js #экспресс #redis

Вопрос:

У меня вопрос новичка. Я пишу свой первый node.js / экспресс REST API. Для одного из моих методов POST клиенты могут отправлять несколько «записей» для сохранения в БД за один раз.

я пытаюсь написать свою логику MULTI / EXEC … используйте примеры в файле readme, который поставляется с клиентом redis.

Но я не вижу, что я делаю неправильно.

Вот как я записываю в свой хэш вручную через redis-cli

 127.0.0.1:6379> hset widget:widget1 00:00:00_00:00:00 123@testmeout.com
(integer) 1
127.0.0.1:6379> 
  

Вот как выглядит мой код

common.js

 var redis = require('redis');
exports.redis = redis.createClient('6379','10.2.2.2');
  

widgets.js

 var common = require('./common');
var redis = common.redis;

router.post('/', function(req, res, next) {

    // do a bunch of stuff. 
    // multi test.  all hardcoded for now until i understand how it works.
    redis.multi([
        ["hset", "widget:widget1", "00:00:00_00:00:00", "123@testmeout.com",redis.print ],
        ["hset", "widget:widget2", "00:00:00_00:00:00", "222@willywonka.com", redis.print]
    ]).exec(function (err, replies) {
            if (err ){
                    console.log(err);
            } else {
                console.log(replies);
            }
    });
  

На консоли я вижу

  [ undefined, undefined ]
  

для вывода «ответов». Я не получаю никаких ошибок. Но я также не вижу ни одного из своих хэшей в базе данных. Я попробовал этот запрос в redis-cli, чтобы убедиться, что в базу данных ничего не добавлено:

 127.0.0.1:6379> scan 0 match widget:w* count 10000000
1) "0"
2) (empty list or set)
  

ПРАВКА 1

В качестве теста я попытался добавить вызов HGETALL в свой multi. и это работает. Теперь обратите внимание на множественный код:

 redis.multi([
    ["hgetall", "widget:7449890"],
    ["hset", "widget:widget1", "00:00:00_00:00:00", "123@testmeout.com",redis.print ],
    ["hset", "widget:widget2", "00:00:00_00:00:00", "222@willywonka.com", redis.print]
]).exec(function (err, replies) {
        if (err ){
                console.log(err);
        } else {
            console.log(replies);
        }
});
  

Которая возвращает следующее на консоли:

 [ { '00:00:00_00:00:00': 'johndoe@test.net' },
  undefined,
  undefined ]
  

Также я обнаружил еще один интересный артефакт — я включил мониторинг redis-cli при запуске моего приложения node js, и я вижу, что к базе данных выполняются следующие запросы:

 1476985090.048093 [0 10.238.36.117:36069] "multi"
1476985090.048118 [0 10.238.36.117:36069] "hgetall" "widget:7449890"
1476985090.048137 [0 10.238.36.117:36069] "exec"
1476985092.800405 [0 10.238.36.118:6379] "PING"
  

Я полагаю, тем самым доказывая, что команды HSET вообще не выполняются.

Я также попытался изменить hset на hsetall … но результат тот же. Ошибок нет, но и команда set не выполняется.

Комментарии:

1. Опечатка, вы должны ввести scan 0 match widget:myw* count 10000000 или keys widget:myw* .

2. (В вашем примере, приведенном вручную, ключ отличается от ключа в коде).

3. да, извините, это была просто опечатка, когда я писал сообщение, по сравнению с опечаткой в реальных тестах, которые я запускаю. Я исправил сообщение.

4. я понял это! я виноват. код выполнялся с подчиненным устройством базы данных redis, доступным только для чтения. ого! извините за шум, ребята