为什么我无法从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;
    });
}
    

要回复问题请先登录注册