Данные, поступающие из кеша Redis, не разбиты на страницы

До того, как я внедрил кеш Redis в свой бэкэнд API, нумерация страниц нормально работала на бэкенде и на фронтенде, после кэширования данных она больше не работает. Вот мое промежуточное ПО, которое запускается до того, как я получу все данные

const checkCache = (req, res, next) => {
  client.get("posts", (err, data) => {
    if (err) {
      console.info(err);
      sendFailureResponse(res, 500, err);
    }
    if (data != null) {
      sendSuccessResponse(res, 200, JSON.parse(data));
    } else {
      //proceed to next middleware function
      next();
    }
  });
};

Контроллер

const page = parseInt(req.query.page);
    const size = parseInt(req.query.size);
    const query = {};
    if (page < 0 || page === 0) {
      sendFailureResponse(res, 400, "invalid page number")
    }
    query.skip = size * (page - 1);
    query.limit = size;

    const posts = await Post.find({}, {}, query).populate("user", ["name"]);
    client.setex("posts", 3600, JSON.stringify(posts))
    sendSuccessResponse(res, 200, posts);
  } catch (err) {
    sendFailureResponse(res, 500, err.message);
  }

Как я могу вернуть результат с разбивкой на страницы из кеша?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
552
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете просто добавить номер страницы к ключу ('page' + req.query.page), и тогда у вас будет кеш на страницу

Кстати, у вас есть ошибка в промежуточном программном обеспечении checkCache: если есть ошибка, вы вызываете обе функции sendFailureResponse и next, и вы получите ошибку "ERR_STREAM_WRITE_AFTER_END"

Спасибо, @Лейбале. Вы имеете в виду добавление дополнительного ключа к этому? client.setex("сообщения", 3600, JSON.stringify(сообщения))

Fehmy 25.12.2020 12:12

@Fehmy, вы можете думать о сервере Redis как об объекте, и каждый раз, когда вы вызываете client.setex(key, ttl, value), он будет устанавливать/*переопределять* значение «ключа» отправленным вами значением. в вашем случае каждый раз, когда вы вызываете client.setex('posts', ...), вы устанавливаете значение posts как текущую страницу, но затем, если кто-то делает вызов API для другой страницы, вы выполняете поиск по ключу posts, не убедившись, что страница, которая была кэширована, страницу, которую вы хотите вернуть. Если вы хотите иметь кеш на страницу, добавление номера страницы в ключ (как я описал в ответе) «решит» проблему.

Leibale Eidelman 26.12.2020 22:59

Другие вопросы по теме