Переопределить res.write в NodeJS - PullRequest
3 голосов
/ 21 марта 2011

Я уже некоторое время играю с NodeJS, и мне действительно это нравится, но я врезался в стену ...

Я пытаюсь создать модуль подключения для перехвата методов http.ServerResponse. Моя конечная цель - позволить пользователю применить какой-то фильтр к исходящим данным. Например, у них будет возможность применить сжатие или что-то еще до того, как данные выйдут.

У меня странная ошибка, хотя ... этот метод вызывается в два раза чаще, чем следовало бы.

Вот мой код:

var http = require('http'), orig;

orig = http.ServerResponse.prototype.write;

function newWrite (chunk) {
    console.log("Called");

    orig.call(this, chunk);
}

http.ServerResponse.prototype.write = newWrite;

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.write("Hello");
    res.write(" World");
    res.end();
    console.log("Done");
}).listen(12345);

Это работает, и я получаю 'Hello World' в качестве вывода, когда я получаю к нему доступ через браузер, но я получаю 4 'Called' на консоль, и 'Done' получает вывод дважды. Это приводит меня к мысли, что по какой-то причине мой серверный код вызывается дважды. Я сделал console.log в своем методе newWrite для this.constructor, и конструктором в обоих случаях является ServerResponse, так что это мало поможет.

Я действительно смущен тем, что здесь происходит. Что может происходить ?? Это напрямую не влияет на вывод, но я мог бы потенциально обслуживать гигабайты сжатых данных для многих клиентов одновременно, и выполнение всего дважды приведет к чрезмерной нагрузке на мой сервер.

Это будет частью более крупного файлового сервера, поэтому акцент делается не на том, чтобы делать все дважды.

Edit:

Я уже читал этот вопрос на случай, если вам интересно:

Могу ли я использовать http.ServerResponse в качестве прототипа в node.js?

Ответы [ 2 ]

6 голосов
/ 21 марта 2011

Нет проблем с вашим кодом: если вы добавите console.log(req.url) в вызов createServer, вы, вероятно, увидите, что он на самом деле дважды вызывается вашим браузером . Большинство браузеров запрашивают запрошенный URL-адрес и дополнительный вызов для /favicon.ico, если в разметке html не указан favicon.

2 голосов
/ 21 марта 2011

Вы можете использовать связующее ПО favicon для подключения, чтобы избежать этой проблемы:

http://senchalabs.github.com/connect/middleware-favicon.html

...