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中,我只需调用端点并等待答案。当我收到它时,我会在一秒钟后再次调用端点。
测试应按以下方式进行:
很明显,问题是“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!!!");
}
});
});