J'ai compris cela. J'ai utilisé la bibliothèque Q pour exécuter toutes les fonctions au lieu de client.multi().exec(). Cela a permis une exécution propre de toutes les commandes post redis et m'a ensuite permis de récupérer les informations.
Dans le fichier routes.js, je n'avais qu'un bref morceau de code. Tout est exécuté dans le fichier doctorDB.js.
routes.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); });
};
Ceci est transmis à la fonction getInfo() qui envoie une réponse côté client :
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
};