@jeruthadam
Я крут

Почему redis возвращает true а не данные?

Использую редис совместно с Нодой. Логика такая - редис возвращает на запрос урл данные, если они хранятся в нем, если нет, то совершается запрос axios, данные возвращаются и сохраняются в самом редис, для того чтобы дальше их использовать. Нижеприведенный код не работает, возвращает просто true. Где закралась ошибка?

const cat = axios('http://localhost:3001/cat')
    .then((response) => {
      return response.data
    })
    .catch(error => error)

    const dog = client.get('http://localhost:3002/dog', function (error, dog) {
      if (error) { throw error }
      if (dog) {
        return JSON.parse(dog)
      } else {
        axios('http://localhost:3002/dog')
        .then((response) => {
          return response.data
          client.set('http://localhost:3002/dog', JSON.stringify(response.data), function (error) {
            if (error) { throw error }
          })
        })
        .catch(error => error)
      }
    })

    Promise.all([cat, dog])
    .then((pets) => {
      console.log(pets)
      const cats = pets[0]
      const dogs = pets[1]
      res.json({
        results: {
          cats,
          dogs
        }
      })
    })
    .catch((err) => {
      res.json({
        error: err
      })
    })


UPD. Провел тест, вывел в консоль это const test = client.get('test') вернулось тоже true! В redis-cli возвращает фразу, как положено. Получается, проблема может быть где-то в другом месте? Первый день с редис, прошу помощи.

UPD #2. Проверив в redis-cli get "http://localhost:3002/dog" я увидел, что данные уже в редис! Т.е. сработал client.set. Почему же не работает client.get? Я могу использовать const и возращать значение? ПРоблема в этом? Как переписать? Ничего в голову не приходит.
  • Вопрос задан
  • 435 просмотров
Решения вопроса 1
@rail-ka
Программист.
Предыдущий ответ верный, добавлю лишь что если хотите использовать промисы, нужно подключить библиотеку bluebird:
const redis = require('redis');
const bluebird = require('bluebird');
bluebird.promisifyAll(redis.RedisClient.prototype);
bluebird.promisifyAll(redis.Multi.prototype);

и все функции использовать с Async в конце:
const dog = client.getAsync('http://localhost:3002/dog').then((dog) => {
   // ...
});

Потом можно использовать Promise.all
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
boratsagdiev
@boratsagdiev
const dog = client.get('http://localhost:3002/dog', function (error, dog) {
      if (error) { throw error }
      if (dog) {
        return JSON.parse(dog)
      }


У вас вот это возвращает не промис, а вы потом пытаетесь это развернуть через Promise.all, посмотрите в эту сторону.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы