Express Node.JS – Recepción de callback Redis, ejecutando promesas

Tengo una función de enrutamiento Nodo / Expreso que ejecuta una llamada Redis en otro módulo. Quiero realizar una función Redis compleja en un módulo de nodo y enviar una callback simple que diga que es un éxito para el módulo de enrutamiento. La llamada Redis se ejecuta, pero no puedo realizar ninguna función síncrona que recupere incluso un valor verdadero simple de la llamada Redis. Aquí está mi función Redis:

doctorDB.js

var addDoctor = function addDoctor(id, doc){ var fields = Object.keys(doc.fields); return client.multi() .sadd("Doctors", id) .hmset(id, "lastName", doc.lastName, "firstName", doc.firstName) .hmset(id, "email", doc.email, "university", doc.university, "work", doc.work) .sadd(id + ":fields", fields) .exec(function(err, replies){ console.log("It's in this"); if (doc.middleName){ console.log("Now here"); client.hset(id, "middleName", doc.middleName); return true; } else { console.log("Or here"); return true; } }); }; 

Todo está funcionando en ese extremo. Ahora quiero que la callback se envíe al enrutador Express para enviar una respuesta al lado del cliente. Quiero que sea en forma de una función síncrona, y he probado muchos usando Q y Async, pero nada funciona. Entonces, ya sea A. No tengo una comprensión completa de las funciones de promesa, o B. No tengo una comprensión completa de la devolución de valores a otro módulo. Cualquier ayuda sería apreciada.

Para referencia, aquí hay muchos bashs fallidos en el extremo del enrutador expreso:

rutas.js

 app.post('/addDoctorInfo', ensureLoggedIn('/login'), function(req, res, next){ // function getThis(req){ // var deferred = Q.defer(); // doctorDB.addDoctor(req.body.id, req.body.doc).then(function(response){ // deferred.resolve(response); // }, function(err){ // console.log(err); // return deferred.resolve(err); // }); // return deferred.promise; // } // var x = getThis(req); // console.log(x); doctorDB.addDoctor(req.body.id, req.body.doc).then(function(x){ console.log(x); }).catch(function(err){ console.log(err); }).finally(function(){ console.log("We made it!"); }); // function sendMsg(info){ // console.log(info); // res.send({success: true}); // } // async.waterfall([ // doctorDB.addDoctor(req.body.id, req.body.doc), // sendMsg(info) // ], function(err){ // console.log(err) // }); // var DBCALL = doctorDB.addDoctor(req.body.id, req.body.doc); // Q.fcall(DBCALL).then(function(x){ // return console.log(x); // }).catch(function(err){ // console.log(err); // }); }); 

Me di cuenta de esto. Usé la biblioteca Q para realizar todas las funciones en lugar de client.multi (). Exec (). Esto permitió una ejecución limpia de todos los comandos de redis post y luego me permitió recuperar la información.

En el archivo route.js, solo tenía un poco de código. Todo se ejecuta en el archivo doctorDB.js.

rutas.js

 app.post('/addDoctorInfo', ensureLoggedIn('/login'), function(req, res, next){ return doctorDB.addDoctor(req.body.id, req.body.doc, req, res, next); }); 

doctorDB.js

 var addDoctor = function addDoctor(id, doc, req, res, next){ var fields = Object.keys(doc.fields); function middleName(id, doc){ if (doc.middleName){ return client.hset(id, "middleName", doc.middleName); } else { return; } } return Q.all([Q.ninvoke(client, 'sadd', 'Doctors', id), Q.ninvoke(client, 'hmset', id, "lastName", doc.lastName, "firstName", doc.firstName, "email", doc.email, "university", doc.university, "work", doc.work), Q.ninvoke(client, 'sadd', id + ':fields', fields), middleName(id, doc)]).then(function(x){ return getInfo(id, req, res, next);; }, function (err) { res.status(404); }); }; 

Esto se pasa a la función getInfo () que envía una respuesta al lado del cliente:

 var redisHGetAll = Q.nbind(client.hgetall, client); var getInfo = function getInfo(id, req, res, next){ return redisHGetAll(id).then(function(x){ return findByMatchingProperties(x); }, function (err) { res.status(404); }).then(function(){ return client.smembers(id + ':fields', function(err, reply){ data['fields'] = reply; res.setHeader('Content-Type', 'application/json'); res.end(JSON.stringify(data)); }); }, function (err) { res.status(404); }) }; function findByMatchingProperties(x) { for (var y in x){ checkData(y, x[y]); } function checkData(y, z){ for (var d in data){ if (d === y){ data[d] = z; } } } } var data = { lastName: null, firstName: null, middleName: null, email: null, university: null, work: null, fields: null };