Как метод setex() node-redis преобразует буфер в строку?

#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

  1. Без .toString() — я передаю Buffer в библиотеку, и она позаботится о преобразовании
     const result = await redisClient.setex('testKey', 3600, compressed);
     
  2. и с .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 им грустно публиковать вопросы о stackoverflow

3. Вероятно, ваша строка содержит символ, который необходимо экранировать. Может быть, попробовать использовать phpredis-json? github.com/averias/phpredis-json