Событие request.close не запускается на сервере node.js - PullRequest
2 голосов
/ 12 октября 2011

Я работаю над приложением long-poll, которое использует node.js в качестве сервера. Конкретная задача состоит в том, чтобы сразу узнать, а затем пользователь уходит в автономный режим. Итак, я должен слушать событие request.close, верно?

Я скопировал следующий фрагмент кода из Как проверить, было ли прервано соединение на сервере node.js

var http = require("http"),
    util = require("util");

var httpServer = http.createServer(function(req, res) {
    util.log("new request...");

    // notify me when client connection is lost
    req.on("close", function(err) {
        util.log("request closed...");
    });

    // wait with response for 15 seconds
    setTimeout(function() {
        res.writeHead(200, {'Content-Type': 'text/plain'});
        res.write("response");
        res.end();

        util.log("response sent...");
    }, 15000);
});
httpServer.listen(8888, "127.0.0.1");
util.log("Running on 8888");

Я не могу заставить его работать должным образом:

  1. Я открываю в браузере определенный URL, связанный с сервером node.js

  2. Сразу после этого нажмите кнопку «Стоп».

  3. Node.js ждет 15 секунд, как будто соединение еще живо, а затем регистрирует «ответ отправлен».

Я отключил nginx, чтобы избежать каких-либо проблем, результат тот же. Я также попытался прослушать событие req.connection.on ("close"), результат снова тот же. Версия nodejs - 0.4.12.

Что может быть не так?

1 Ответ

1 голос
/ 12 октября 2011

Прежде всего, вы дважды упомянули событие onclose, а затем разместили код, который прослушивает событие close. Некоторые люди просто пропустят ваш вопрос, когда увидят подобные вещи.

Во-вторых, TCP-соединения - это то, что ОС управляет от имени приложений. В зависимости от того, как вы устанавливаете и разрываете соединение, соединение TCP может оставаться в течение нескольких минут после того, как вы думаете, что разорвало его. Проведите небольшое исследование по TCP, сокету и задержке.

...