2010-12-11 4 views
1

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

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); 

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

ответ

4

От MDC:

Object.create(proto [, propertiesObject ]) 

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

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 - это собственная переменная, которая ссылается на другой объект.

+0

Большое спасибо Иво. Это имеет смысл и должно было быть чем-то, что я мог найти с небольшой охотой через источник. Я полагал, что либо (а) произошла какая-то магия с res, либо (б) произошла лакуна в моих знаниях о прототипном наследовании. Как я и подозревал, последнее имеет место. То, что я пытаюсь выполнить, было шаблоном проектирования прокси, где я мог переопределить только одну функцию нового объекта, скажем writeHead, применить к нему некоторый «фильтр» и вызвать в конце старый res.writeHead. Похоже, что есть более простой способ сделать это. –

Смежные вопросы