2016-01-22 2 views
0

Я пытаюсь извлечь все записи для определенных шаблонов ключей и сделать обратный вызов удачным, я использую Bluebird. Клиент redis для nodejs является node_redis для проекта.Извлечение данных из REDIS с помощью NODE JS и BLUEBIRD

Код в REDIS клиента -

exports.getAllRedisKeysA = function() { 
    var res = rclient.keysAsync("client*").then(function(data) { 
    // console.log(data); 
    }).then(function(data) { 
    var arrayResp = []; 
    for (var element in data) { 
     rclient.hgetallAsync(element).then(function(data) { 
     arrayResp.push(data); 
     }); 
    }; 
    return arrayResp; 
    // console.log(data); 
    }).catch(console.log.bind(console)); 
    console.log(res); // gives an empty promise. 
    return res; 
} 

И эта функция вызывается из контроллера в следующей манере -

var abc = rdata.getAllRedisKeysA(); 
// console.log(abc); // gives undefined 

console.log выход внутри функции REDIS дает оценку пустое обещание, и ничего не возвращается контроллеру.

Я пропустил что-нибудь в реализации?

+1

'arrayResp' всегда будет пустым массивом, когда вы его возвращаете, потому что обещания не делают синхронный асинхронный код - также, в точке, где вы выполняете реестру консоли, это будет ожидающее обещание, потому что обещания не сделать асинхронный код синхронным –

+0

Каков путь к этому? Как я могу это решить? – swateek

+1

Прежде всего, вы должны использовать 'SCAN' вместо' KEYS' (http://redis.io/commands/keys). Во-вторых, как говорит @JaromandaX, вы не можете вернуть результат асинхронных операций. В-третьих, вы не должны использовать 'for (... in ...)' для массивов. Путь к этому - это вернуть обещание, когда вы принесете все ключи. Я не знаком с Bluebird, но [Promise.map] (http://bluebirdjs.com/docs/api/promise.map.html) кажется, ну, обещаю. –

ответ

1

Linus и Jaromanda имели некоторые реальные полезные комментарии к вопросу, которые помогли мне двигаться в правильном направлении. Я использовал способ ниже для получения моих необходимых данных из REDIS с использованием BlueBird Promise и вот как это нужно сделать.

ниже код получает необходимые данные из Redis

exports.getRedisKeyPattern = function(pattern){ 

var allKeys = allKeysPattern(pattern).then(function(data){ 
    var arrayResp = []; 
    var inptArr = []; 
    var newdata = data.slice(1)[0]; 
    for(var i in newdata){ 
    inptArr.push(newdata[i]); 
    }; 
    return new Promise.resolve(inptArr); 
}); 

var valuePerKey = Promise.mapSeries(allKeys, function(dt){ 
    return getAllKeyContents(dt); 
}).then(function(res){ 
    return res; 
}).catch(function(err) { console.log("Argh, broken: " + err.message); 
}); 

return new Promise.resolve(valuePerKey); 
} 

function getAllKeyContents(key){ 
    var data = rclient.hgetallAsync(key).then(function(data){ 
     return data; 
    }).catch(function(err) { console.log("Argh, broken: " + err.message); }); 

    var res = Promise.join(data, key, function(data, key){ 
     return { 
      key: key, 
      data: data 
     }; 
    }); 

    return res; 
} 

От контроллера, функция вызывается, как это -

var rdata = require('../../components/redis/redis-functions'); 
rdata.getRedisKeyPattern("clients*").then(function(response){ 
     return res.status(200).json(response); 
    }); 

.js файл, который содержит функции Redis является включенных в файл контроллера, чтобы можно было использовать функции.