Могу ли я использовать http.ServerResponse в качестве прототипа в node.js? - PullRequest
1 голос
/ 11 декабря 2010

Я не могу заставить это работать:

var proxyResponse = function(res) {
  return Object.create(res);
};

Вызов стандартных методов ответа для объекта, возвращаемого этим методом, не работает, например:

http.createServer(function(req, res) {
  res = proxyResponse(res);
  res.writeHead(200, {"Content-Type": "text/html"});

  res.end("Hallelujah! (Praise the Lord)");
}).listen(8080);

Сервер просто зависает.Может кто-нибудь объяснить, что я делаю не так?

1 Ответ

4 голосов
/ 11 декабря 2010

С MDC :

Object.create(proto [, propertiesObject ])

Это создает новый объект, прототип которого является proto, сам объект не имеет ничего определяющего:

res.foo = function() {
    console.log(this);
}
res.foo();
res = proxyResponse(res);
res.foo();

Результат:

{ socket: 
   { fd: 7,
     type: 'tcp4',
     allowHalfOpen: true,
     _readWatcher: 
      { socket: [Circular],
....

{}

Так почему же он не выдает ошибку и не взрывается? Помимо поиска и настройки испорченного свойства, есть одна причина, по которой он не работает.

Хотя ваш новый объект ссылается на все тот же объект, что и старый, сам по себе НЕ старый.

В: https://github.com/ry/node/blob/a0159b4b295f69e5653ef96d88de579746dcfdc8/lib/http.js#L589

if (this.output.length === 0 && this.connection._outgoing[0] === this) {

Это завершает запрос, this является новым объектом, но this.connection._outgoing[0] все еще ссылается на старый объект, поэтому запрос никогда не завершается и сервер зависает.

Я все еще не знаю, чего вы пытаетесь достичь здесь, так как здесь не имеет смысла использовать Object.create, если вы беспокоитесь о перезаписи res в случае других запросов, это не case, поскольку каждое res - это собственная переменная, которая ссылается на другой объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...