Как получить все ключи и значения из Redis в JavaScript?

Проблема с получением данных из Redis

Создаю API на Node.js и использую Redis для хранения данных. Настроил клиент Redis и могу получать значения по конкретным ключам без проблем.

Что нужно сделать

Нужно извлечь все ключи вместе с их значениями из базы данных Redis. Попробовал реализовать это таким способом:

server.get('/tasks', function (request, response) {
    var taskList = [];
    redisClient.keys('*', function (error, keyArray) {
        if (error) return console.log(error);
        if(keyArray){
            for(var index=0; index<keyArray.length; index++){
                redisClient.get(keyArray[index], function (err, result) {
                    if (err) return console.log(err);
                    var task = {};
                    task['taskId'] = keyArray[index];
                    task['content'] = result;
                    taskList.push(task);
                });  
            }
            console.log(taskList);
            response.json({items: taskList});
        }
    });
});

Проблема

В ответе всегда получаю пустой массив. Подскажите, как правильно это реализовать в JavaScript? Может есть более эффективный способ получения всех данных из Redis?

Классическая асинхронность в JS. У тебя цикл с get запросами отправляет response.json до того, как колбэки успевают завершиться. Попробуй использовать Promise.all или async/await. Я собираю все промисы в массив и жду их через Promise.all. Если знаешь ключи заранее, то используй MGET - это быстрее, чем множественные GET.

Используй EVAL с lua скриптом - получишь всё одним запросом. Если база большая, лучше SCAN вместо KEYS, чтобы не заблокировать сервер. В твоём случае проще всего перейти на async/await и собрать данные в цикле перед ответом.

Проблема в том что ты отправляешь ответ до завершения асинхронных операций. Используй счетчик или лучше команду HGETALL если данные в хэшах. Еще вариант - redis.pipeline() для пакетной обработки. Я обычно делаю через async/await с циклом for…of, так проще отлаживать чем Promise.all. И не забудь проверить что keyArray не пустой перед циклом.