Express Node.JS-接收Redis回调,执行Promise

我有一个Node /

Express路由功能,该功能在另一个模块中执行Redis调用。我想在一个节点模块中执行复杂的Redis功能,并发送一个简单的回调,说路由模块成功了。Redis调用会执行,但是我无法执行任何同步功能,即使从Redis调用中检索甚至是一个简单的true值。这是我的Redis函数:

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.我不完全将值返回到另一个模块。任何帮助,将不胜感激。

作为参考,这是快速路由器端的许多失败尝试:

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

};

以上是 Express Node.JS-接收Redis回调,执行Promise 的全部内容, 来源链接: utcz.com/qa/423120.html

回到顶部