使用节点js从redis获取值

Ale*_*anu 2 javascript node.js

我在下面的代码中做错了什么?在left_label和right_label变量似乎永远是“真”,当我知道我有他们在Redis的设置为某个字符串。我假设这是因为该client.get函数成功并返回 true,但是如何让它返回实际值?

var http = require('http');
var redis = require('redis');
var client = redis.createClient(6379, 127.0.0.1);

var server = http.createServer(function (request, response) {

    var left_label = client.get('left', function(err, reply) {
        console.log(reply);
        return reply;
    });

    var right_label = client.get('right', function(err, reply) {
        console.log(reply);
        return reply;
    });

    response.writeHead(200, {"Content-Type": "text/html"});

    var swig  = require('swig');
    var html = swig.renderFile('/var/www/nodejs/index.html', {
        left: left_label,
        right: right_label
    });

    response.end(html);

});
server.listen(8000);
console.log("Server running at http://127.0.0.1:8000/");
Run Code Online (Sandbox Code Playgroud)

Dan*_*l B 5

这 get调用是异步的,必须进行处理的方式。

一个建议是将它与模块的 NPM 文档中建议的类似bluebird的承诺库结合起来redis。

这样,我们就可以承诺redis 模块并以更简单的方式使用它。

var redis = require('redis');
bluebird.promisifyAll(redis.RedisClient.prototype);
Run Code Online (Sandbox Code Playgroud)

并使用该get函数的新异步版本,如下所示。

function getLabelValues(){
    var left_promise = client.getAsync("left").then(function(reply) {
        return reply;
    });

    var right_promise = client.getAsync("right").then(function(reply) {
        return reply;
    }); 

    return Promise.all([left_label, right_label]);
}

getLabelValues().then(function(results){
    //This is run when the promises are resolved
    //access the return data like below
    var left_label = results[0];
    var right_label = results[1];
});
Run Code Online (Sandbox Code Playgroud)