繁体   English   中英

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

[英]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

我按照以下步骤进行了测试:

  1. 节点server.js
  2. ./client.sh
  3. 在redis中,LPUSH('msg:q:1','blablah')

现在,在控制台上打印了“已发送: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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM