#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, доступным только для чтения. ого! извините за шум, ребята