【问题标题】:Why I couldn't get first few responses from nodeJS' httpServer?为什么我无法从节点 JS 的 http 服务器获得前几个响应?
【发布时间】:2011-04-13 15:19:02
【问题描述】:

我打算使用nodeJS作为我的comet服务器,我写了一些代码进行测试,但是有一个问题,当客户端第一次连接到服务器时,它无法得到服务器的响应。

这是服务器端代码(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. 节点服务器.js
  2. ./client.sh
  3. 在 redis 中,LPUSH('msg:q:1', 'blablah')

现在,控制台上打印了“Sent: blablah”,res.end(reply) 已执行,但客户端什么也没收到。我多次重复第 3 步,然后它按预期工作。如果我重新启动客户端,则无法再次收到前几个响应。

我该如何解决这个问题?

【问题讨论】:

  • 尽量不要使用无限的while循环,而只是有一个for循环最多5或10。然后看看它是否仍然发生。
  • Raynos:谢谢。客户端处于阻塞模式,等待响应。如果我只是执行命令'curl -i http://...',没有任何改变,仍然无法得到响应。
  • 好像是redis的东西。对我来说,节点代码看起来不错。
  • 尝试在 redis-cli 上运行 MONITOR 命令,看看是否一切正常

标签: javascript http node.js comet redis


【解决方案1】:

我认为这里可能发生的情况是你在 curl 等待 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;
    });
}

【讨论】:

    猜你喜欢
    • 2019-08-20
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多