私はこれを理解しました。 client.multi()。exec()の代わりに、Qライブラリを使用してすべての関数を実行しました。これにより、すべてのredis postコマンドをクリーンに実行できるようになり、情報を取得できるようになりました。
ルート.jsファイルには、ほんの少しのコードしかありませんでした。すべてがdoctorDB.jsファイルで実行されます。
routers.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); });
};
これは、クライアント側に応答を送信する関数getInfo()に渡されます:
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
};