微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我无法从nodeJS的httpServer收到前几个响应?

如何解决为什么我无法从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 举报,一经查实,本站将立刻删除。