Devuelve la lista hgetall desde redis en nodejs

Estoy intentando devolver un objeto json para poder devolverlo antes de que una página se represente para rellenar una lista. Mi problema es que no puedo averiguar cómo pasar los datos del objeto desde la función de callback de hgetall. Aquí está mi ejemplo con comentarios sobre lo que me estoy perdiendo:

var redis = require("redis"), client = redis.createClient(); function createMobs() { var mobObject = { name: "Globlin", hp: 12, level: 1 }; client.hmset("monsterlist", "mobs", JSON.stringify(mobObject)); var myMobs = function(object) { return object; }; var getMobs = function(callback) { client.hgetall("monsterlist", function(err, object) { callback(object); }); }; // This is returning undefined instead of my mob console.log("mobs: ", getMobs(myMobs)); // Goal is to return moblist // return getMobs(myMobs); } exports.createMobs = createMobs; 

La respuesta corta es que no estás pensando de forma asíncrona. Debido a que está utilizando funciones asíncronas en su función, su función también debe ser asíncrona.

Como no publicó el rest de su código, aquí está la idea básica:

 var client = require('redis').createClient(); function createMobs(callback) { var mobObject = { name: 'Goblin' }; client.hmset('monsterlist', 'mobs', JSON.stringify(mobObject), function(err) { // Now that we're in here, assuming no error, the set has went through. client.hgetall('monsterlist', function(err, object) { // We've got our object! callback(object); }); // There is no way to run code right here and have it access the object variable, as it would run right away, and redis hasn't had time to send you the data yet. Your myMobs function wouldn't work either, because it is returning a totally different function. }); }; app.get('/create', function(req, res) { createMobs(function(object) { res.render('mobs.jade', { mobs: object }); }); }); 

Esperemos que eso ayude a aclarar las cosas.