Incr似乎跑了两次 - 为什么?

时间:2012-04-23 23:04:22

标签: node.js redis

我很难获得node,redis和async来做我想做的事情。我正在尝试非常基本的东西来掌握重定向控制流的模式。在这里,我持有一个计数器变量“success”,如果比较key0 > key1为真,则增加1。它们现在是静态的,所以它总是如此;我唯一希望改变的是增加success。我刷新浏览器以重新运行比较并再次递增success

我的麻烦在于:刷新页面后,success会跳过2。我尝试使用incr进行回调,但看起来只有get } -type命令有回调。我的脚本中有client.end();,但它阻止我重新加载页面,因此我对其进行了评论。我怀疑这是我的问题的根源。如果是,client.end属于哪里?

var http = require("http");
var redis = require("redis");
var async = require("async");

client = redis.createClient();

http.createServer(function(request, response) {
        // key "success" set to 0 externally, through redis-cli;
        client.set("key0", "19");
        client.set("key1", "11");

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

        async.series([
              shortcut("key0"),
              shortcut("key1"),
              shortcut("success")
             ],

             function(err, results){
                 if (results[0] > results[1]) {
                     client.incr("success", function(err, reply) {
                             response.write("incr done");
                         });
                     response.write(results[0] + "\n\n");
                     response.write(results[1] + "\n\n");

                     response.write(results[2]);
                 }
                 response.end();
                 // client.quit();
         });
    }).listen(8000);

function shortcut(key) {
    return function(callback) { 
        client.get(key, function(err, reply) { 
                          callback(null, reply); 
                        }
                  ); 
    }
}

1 个答案:

答案 0 :(得分:4)

您的浏览器很可能会请求favicon.ico,从而生成额外的请求,该请求会再次运行您的代码。