我有一个Node / Express路由功能,该功能在另一个模块中执行Redis调用。我想在一个节点模块中执行复杂的Redis功能,并发送一个简单的回调,说路由模块成功了。Redis调用会执行,但是我无法执行任何同步功能,即使从Redis调用中检索甚至是一个简单的true值。这是我的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; } }); };
一切都为此目的而努力。现在,我希望将回调发送到Express路由器,以将响应发送到客户端。我希望它采用同步功能的形式,并且我已经尝试使用Q和Async进行许多操作,但是没有任何效果。因此,要么A.我对Promise函数不完全了解,要么B.我不完全将值返回到另一个模块。任何帮助,将不胜感激。
作为参考,这是快速路由器端的许多失败尝试:
routes.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); // }); });
我想通了。我使用Q库代替了client.multi()。exec()来执行所有功能。这样可以干净地执行所有redis post命令,然后让我检索信息。
在routes.js文件中,我只有一小段代码。一切都在doctorDB.js文件中执行。
app.post('/addDoctorInfo', ensureLoggedIn('/login'), function(req, res, next){ return doctorDB.addDoctor(req.body.id, req.body.doc, req, res, next); });
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 };