Javascript 为什么我不能';我们无法从nodeJS&x27;httpServer?
我计划使用nodeJS作为comet服务器,并编写了一些测试代码,但有一个问题是,当客户端第一次连接到服务器时,它无法从服务器获得响应 以下是服务器端代码(server.js): 以及客户端代码(client.sh): 我通过以下步骤对其进行了测试:Javascript 为什么我不能';我们无法从nodeJS&x27;httpServer?,javascript,http,node.js,comet,redis,Javascript,Http,Node.js,Comet,Redis,我计划使用nodeJS作为comet服务器,并编写了一些测试代码,但有一个问题是,当客户端第一次连接到服务器时,它无法从服务器获得响应 以下是服务器端代码(server.js): 以及客户端代码(client.sh): 我通过以下步骤对其进行了测试: node server.js //client.sh 在redis中,LPUSH('msg:q:1','blablah') 现在,控制台上打印了“Sent:blablah”,执行了res.end(reply)。我多次重复步骤3,然后它就如预期的那样
res.end(reply)
。我多次重复步骤3,然后它就如预期的那样工作了。如果重新启动客户端,将无法再次收到前几个响应
如何解决此问题?我认为可能发生的情况是,在等待redis响应时,您已经中止了curl。HTTP客户端中止后,redis命令仍保持活动状态。然后将另一个元素推送到队列中,redis命令返回,但没有要写入的HTTP响应。再次启动curl循环时,您会发现队列为空 这是您的程序的一个修改版本,用于流式传输响应并检测客户端中止。它不会将元素放回队列,但您当然也可以这样做
var util = require('util');
var redis = require('redis').createClient();
var http = require('http');
redis.on("error", function (err) {
console.log("Redis error " + err);
});
redis.on("ready", function () {
console.log("Redis client ready");
});
var server = http.createServer(requestListener);
server.listen(9898);
function requestListener(req, res) {
var aborted = false;
res.writeHead(200, {
"Content-Type": "text/plain"
});
res.write("Checking redis...\n");
redis.brpoplpush('q', 's', 20, function (err, reply) {
if (aborted) {
return console.log("Client aborted before redis reply came back.");
}
if (err) {
return res.end("Redis error");
}
res.end("Redis reply: " + reply);
});
req.on("aborted", function () {
console.log("HTTP client aborted.");
aborted = true;
});
}
试着不要使用无限while循环,而只使用一个最多5或10的for循环。那就看看它是否还会发生。雷诺斯:谢谢。客户端处于阻塞模式,等待响应。如果我只是执行命令'curl-Ihttp://...’,没有任何变化,仍然无法得到响应。看起来像是一个redis的东西。在我看来,节点代码看起来不错。请尝试在redis cli上运行MONITOR命令,查看是否一切正常
#!/bin/bash
while [ 1 ]
do
curl -i http://192.168.1.254:9898
done
var util = require('util');
var redis = require('redis').createClient();
var http = require('http');
redis.on("error", function (err) {
console.log("Redis error " + err);
});
redis.on("ready", function () {
console.log("Redis client ready");
});
var server = http.createServer(requestListener);
server.listen(9898);
function requestListener(req, res) {
var aborted = false;
res.writeHead(200, {
"Content-Type": "text/plain"
});
res.write("Checking redis...\n");
redis.brpoplpush('q', 's', 20, function (err, reply) {
if (aborted) {
return console.log("Client aborted before redis reply came back.");
}
if (err) {
return res.end("Redis error");
}
res.end("Redis reply: " + reply);
});
req.on("aborted", function () {
console.log("HTTP client aborted.");
aborted = true;
});
}