До того, как я внедрил кеш 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);
}
Как я могу вернуть результат с разбивкой на страницы из кеша?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете просто добавить номер страницы к ключу ('page' + req.query.page), и тогда у вас будет кеш на страницу
Кстати, у вас есть ошибка в промежуточном программном обеспечении checkCache:
если есть ошибка, вы вызываете обе функции sendFailureResponse и next, и вы получите ошибку "ERR_STREAM_WRITE_AFTER_END"
@Fehmy, вы можете думать о сервере Redis как об объекте, и каждый раз, когда вы вызываете client.setex(key, ttl, value), он будет устанавливать/*переопределять* значение «ключа» отправленным вами значением. в вашем случае каждый раз, когда вы вызываете client.setex('posts', ...), вы устанавливаете значение posts как текущую страницу, но затем, если кто-то делает вызов API для другой страницы, вы выполняете поиск по ключу posts, не убедившись, что страница, которая была кэширована, страницу, которую вы хотите вернуть. Если вы хотите иметь кеш на страницу, добавление номера страницы в ключ (как я описал в ответе) «решит» проблему.
Спасибо, @Лейбале. Вы имеете в виду добавление дополнительного ключа к этому? client.setex("сообщения", 3600, JSON.stringify(сообщения))