2015-11-19 29 views
0

我在下面的代码中做了什么错误? left_labelright_label变量似乎总是“真实的”,当我知道我在Redis中将它们设置为某个字符串时。我假设这是因为client.get函数成功并返回true,但是如何获取它以返回实际值?使用节点j从redis获取值

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/"); 
+0

Redis的访问是异步的,'reply'具有实际价值,但是'left_label'和''right_label不会有它 –

回答

1

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

建议将其与模块的NPM文档中建议的承诺库(如bluebird)结合使用。

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

var redis = require('redis'); 
bluebird.promisifyAll(redis.RedisClient.prototype); 

并使用新的异步版本的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]; 
}); 
+0

是的,这几乎做到了。谢谢! –