![](/img/trans.png)
[英]Redis / Node.js - 2 clients (1 pub/sub) causing issues with writes
[英]Node.js redis pub/sub missing message
我正在嘗試從兩天后開始調試此代碼,但無法弄清楚,所以我問您。
代碼非常簡單:兩個端點幾乎可以完成相同的操作。
第一個“ s”偵聽通道“ idS”上的任何消息。 如果10秒鍾后仍未收到任何東西,則結束。 如果req.body不為空,則將其發送到'c'。
在第二個中,“ c”總是向“ idS”發送消息,並在通道“ idC”上等待消息。
在“ s”中,變量“ id”設置為1,因此“ c”可以了解“ s”何時在線。
我有兩個不同的測試程序(每個端點一個)。
在testS中,我不使用req.body調用端點,當我收到答案時,我再次使用req.body調用端點。
在testC中,我只是調用端點並等待答案。 收到該消息后,我會在一秒鍾后再次呼叫該端點。
測試應該以這種方式工作:
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沒有發送它??)。
該錯誤不在測試程序中。
謝謝你的幫助!
用then-redis解決。 問題是同步的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.