Node.js redis pub / sub缺少消息

时间:2016-01-13 14:10:52

标签: javascript node.js express redis publish-subscribe


我试图从两天开始调试这段代码,我无法弄明白,所以我问你。
代码非常简单:两个端点几乎完全相同。
第一个,',收听频道上的任何消息' idS'。如果在10秒后它没有收到任何东西,它就会结束。如果req.body不为空,请将其发送给' 在第二个中,' c'始终向“IDS”发送消息。并等待频道' idC'。
在''变量' id'设置为1,因此' c'可以理解什么时候该过的?在线。
我有两个不同的测试程序(每个端点一个)。
在testS中,我在没有req.body的情况下调用端点,当我收到一个答案时,我再次调用端点,这次使用req.body。
在testC中,我只需调用端点并等待答案。当我收到它时,我会在一秒后再次呼叫端点
测试应该以这种方式工作:

  1. s connect,它没有任何内容可以发送,只能在频道上收听' idS'。
  2. c连接,收听频道' idC'并发送" test" on' idS'。
  3. 收到频道' idS'消息"测试"并退出。
  4. 一个新的连接,在频道上收听' idS'并在c上发送消息' idC'。
  5. c通过频道' idC'并退出。
  6. 新的c在一秒后再次连接并从2开始重复。

  7. var express = require('express'),
        redis = require('redis'),
        util = require('util'),
        client = redis.createClient(6379, 'localhost');
    var router = express.Router();
    
    router.post('/s', function(req, res){
        var id = req.query.code;
        var cId = "c_" + id;
        var sId= "s_" + id;
    
        //BUILD RESPONS
        var respons = {....};
    
        var clientSub = redis.createClient(6379, "localhost");
        clientSub.on("message", function(channel, msg){
            if(timeoutId)
                clearTimeout(timeoutId);
            client.del(id);
            respons.val = idS;
            clientSub.unsubscribe(idS);
            clientSub.quit();
            res.send(respons).end();
        });
        clientSub.subscribe(idS);
        client.set(id, 1);
    
        if(req.body){
            client.publish(idC, JSON.stringify(req.body));
        }
    
        var timeoutId = setTimeout(function(){
            if(!res.headersSent){
                clientSub.unsubscribe(idS);
                clientSub.quit();
                client.del(id);
                console.log(" HUB TIMEOUTED " + id);
    
                res.json(respons).end();
            }
        },1000*10);
    });
    
    router.post('/c', function(req, res){    
        var id = //code to get id
        var idC = "c_" + id;
        var idS= "s_" + id;
    
    
        var clientSub = redis.createClient(6379, "localhost");
        clientSub.once("message", function(channel, msg){
            var respons = {};
            respons.data = msg;
            clientSub.unsubscribe(idC);
            clientSub.quit();
            res.json(respons).end();
        });
        //subscribe to a channel
        clientSub.subscribe(idC);
    
    
        //try to send message
        client.get(id, function(err, reply){
            if(err)
                console.log(err);
            else if(reply == 1){
                client.publish(idS, "test");
            } else{
                console.log("ERROR!!!");
            }
    
        });
    });
    

    问题很明显,有时候,' c'有时会收到关于“idC' (或者s不发送??) 该错误不在测试程序中。

    感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

用then-redis解决了。问题是同步问题。