#node-redis
#узел-redis
Вопрос:
Я использую node-redis и надеялся, что кто-нибудь поможет мне разобраться, как эта библиотека преобразуется Buffer
в строку. Я архивирую свои данные перед тем, как сохранить их в redis с помощью node-gzip, и этот вызов возвращает Promise<Buffer>
const data = JSON.stringify({ data: 'test' });
const compressed = await gzip(data, { level: 9 });
Я протестировал следующие 2 подхода к сохранению данных буфера в redis
- Без
.toString()
— я передаюBuffer
в библиотеку, и она позаботится о преобразованииconst result = await redisClient.setex('testKey', 3600, compressed);
- и с
.toString()
const result = await redisClient.setex('testKey', 3600, compressed.toString());
Когда я пробую эти 2 подхода, я не получаю того же значения, сохраненного в redis. Я пытался использовать разные параметры для .toString()
соответствия результату 1), но это не сработало
Причина, по которой мне нужно сохраненное значение в формате 1), заключается в том, что я сопоставляю формат значения с тем, что генерирует одна из страниц php
Мой код отлично работает без .toString()
него, но я хотел бы знать, как node-redis
он обрабатывается внутренне
Я пытался найти ответ в исходном коде, отладить и перейти к вызовам библиотеки, но я не нашел ответа, который искал, и я надеюсь, что кто-нибудь сможет мне в этом помочь
Ответ №1:
Похоже, это происходит в utils.js файл: utils.js
if (reply instanceof Buffer) {
return reply.toString();
}
Также используйте правильные параметры (например, return_buffers):
узел-redis README
redis.createClient({ return_buffers: true });
Комментарии:
1. Большое вам спасибо за изучение этого и извините за задержку ответа. Я только что протестировал это, но точка останова так и не была достигнута… Я нашел запись этого потока , но у меня не было времени искать дальше. Я пытаюсь выяснить, почему буфер сохраняется по-разному в redis, когда я использую explicit
.toSting()
и когда я позволяю redis обрабатывать преобразование буфера в строку…2. Мне не нужно читать буферы в node. Проблема, с которой я сталкиваюсь, заключается в том, что когда я использую
.toString()
буфер перед сохранением значения в redis, он сохраняет данные в redis, которые php-скрипт не может декодировать… Но если я не использую.toString()
и позволяю библиотеке redis обрабатывать это, тогда php может прочитать значение redis без каких-либо проблем. Я пытаюсь выяснить, как именно библиотека redis обрабатывает преобразование этого буфера в строку. Я спрашиваю здесь, потому что на странице redis github им грустно публиковать вопросы о stackoverflow3. Вероятно, ваша строка содержит символ, который необходимо экранировать. Может быть, попробовать использовать phpredis-json? github.com/averias/phpredis-json