Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js redis发布/订阅缺少消息_Javascript_Node.js_Express_Redis_Publish Subscribe - Fatal编程技术网

Javascript Node.js redis发布/订阅缺少消息

Javascript Node.js redis发布/订阅缺少消息,javascript,node.js,express,redis,publish-subscribe,Javascript,Node.js,Express,Redis,Publish Subscribe,我试图在两天内调试这段代码,但我想不通,所以我问你 代码非常简单:两个端点做几乎相同的事情。 第一个“s”监听通道“id”上的任何消息。如果10秒后没有收到任何信息,则结束。如果请求正文不为空,请将其发送到“c”。 在第二个“c”中,始终向“idS”发送消息,并等待“idC”频道上的消息 在“s”中,变量“id”设置为1,以便“c”可以理解“s”何时联机。 我有两个不同的测试程序(每个端点一个) 在测试中,我调用没有req.body的端点,当我收到应答时,我再次调用端点,这次是使用req.bod


我试图在两天内调试这段代码,但我想不通,所以我问你
代码非常简单:两个端点做几乎相同的事情。
第一个“s”监听通道“id”上的任何消息。如果10秒后没有收到任何信息,则结束。如果请求正文不为空,请将其发送到“c”。
在第二个“c”中,始终向“idS”发送消息,并等待“idC”频道上的消息
在“s”中,变量“id”设置为1,以便“c”可以理解“s”何时联机。
我有两个不同的测试程序(每个端点一个)
在测试中,我调用没有req.body的端点,当我收到应答时,我再次调用端点,这次是使用req.body
在testC中,我只需调用端点并等待答案。当我收到它时,我会在一秒钟后再次调用端点。

测试应按以下方式进行:

  • s connect,它没有任何要发送的内容,只是在通道“idS”上侦听
  • c连接、监听“idC”频道,并在“idS”上发送“测试”
  • s在通道“ID”上接收消息“test”并退出
  • 新的s连接,监听“idS”频道,并在“idC”上向c发送消息
  • c在“idC”频道接收并退出
  • 一秒钟后再次连接新的c,并从2开始重复

  • 很明显,问题是“c”有时在“idC”上没有收到消息(或者s没有发送消息)。
    该错误不在测试程序中


    谢谢你的帮助

    用当时的redis解决。这是一个同步问题

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