Я уже некоторое время играю с 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?