如何解决为什么我无法从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
我按照以下步骤进行了测试:
节点server.js
./client.sh
在redis中,LPUSH(\'msg:q:1 \',\'blablah \')
现在,控制台上印有“ Sent:blablah”,被res.end(reply)
,但是客户什么也没收到。我重复步骤3多次,然后按预期方式工作。如果我重新启动客户端,将无法再收到前几个响应。
我该如何解决?
解决方法
我认为这里可能正在发生的事情是,您在等待来自Redis的响应时中止了卷曲。 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;
});
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。