2016-01-13 87 views
0


我想從兩天開始調試這段代碼,我無法弄清楚所以我問你。
代碼非常簡單:兩個端點幾乎完成相同的事情。
第一個's',收聽頻道'idS'上的任何消息。如果10秒後它不會收到任何東西,它會結束。如果req.body不爲空,請將其發送到'c'。
在第二個'c'中,總是向'idS'發送消息並等待通道'idC'上的消息。
在's'變量'id'被設置爲1,因此'c'可以理解's'在線。
我有兩個不同的測試程序(每個端點一個)。
在testS中,我沒有req.body調用端點,當我收到答案時,我再次調用端點,這次是req.body。
在testC中,我只需調用端點並等待答案。當我收到它時,我會在一秒鐘後再次呼叫端點。

試驗應在這樣的工作:
Node.js redis pub/sub丟失消息

  1. ■連接,它沒有任何發送,但監聽通道「標識」。
  2. c連接,在頻道'idC'上偵聽並在'idS'上發送「測試」。
  3. s在通道'idS'上接收消息「test」並退出。
  4. 一個新的連接,在頻道'idS'上收聽並在'idC'上發送一條消息給c。
  5. c在通道'idC'上接收並退出。
  6. 出c在一秒之後再次連接,並重復從2


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!!!"); 
     } 

    }); 
}); 

問題,appartently,是 'c' 的,有時,不接收對「消息idC'(或s不發送?)。
該錯誤不在測試程序中。

感謝您的幫助!

回答

0

用then-redis解決。問題是同步的。