[英]Why I couldn't get first few responses from nodeJS' httpServer?
我打算将nodeJS用作我的彗星服务器,并且编写了一些测试代码,但是存在一个问题,当客户端第一次连接到服务器时,它无法获得服务器的响应。
这是服务器端代码(server.js):
var util = require('util');
var redis = require('redis').createClient(6379, '192.168.1.254');
var http = require('http');
redis.on("error", function (err) {
console.log("Error " + err);
});
var server = http.createServer(requestListener);
server.listen(9898, '192.168.1.254');
function requestListener(req, res) {
util.log('Connected.');
redis.brpoplpush('msg:q:1', 'msg:s:1', 20, function(err, reply) {
if (err) {
util.log('ERROR: ' + err);
}
var length = reply ? reply.length : 0;
res.writeHead(200, {
'Content-Type':'text/plain',
'Content-Length':length
});
if (length) {
res.end(reply);
util.log('Sent: ' + reply);
} else {
res.end('');
}
});
}
和客户端代码(client.sh):
#!/bin/bash
while [ 1 ]
do
curl -i http://192.168.1.254:9898
done
我按照以下步骤进行了测试:
现在,在控制台上打印了“已发送:blablah”,对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;
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.