Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我不能';我们无法从nodeJS&x27;httpServer?_Javascript_Http_Node.js_Comet_Redis - Fatal编程技术网

Javascript 为什么我不能';我们无法从nodeJS&x27;httpServer?

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,然后它就如预期的那样

我计划使用nodeJS作为comet服务器,并编写了一些测试代码,但有一个问题是,当客户端第一次连接到服务器时,它无法从服务器获得响应

以下是服务器端代码(server.js):

以及客户端代码(client.sh):

我通过以下步骤对其进行了测试:

  • node server.js
  • //client.sh
  • 在redis中,LPUSH('msg:q:1','blablah')
  • 现在,控制台上打印了“Sent: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;
        });
    }
    

    试着不要使用无限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;
        });
    }