我无法使它正常工作:

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


服务器只是挂起。有人可以解释我在做什么错吗?

最佳答案

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是引用不同对象的自己的变量。

关于javascript - 我可以将http.ServerResponse用作node.js中的原型(prototype)吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4415346/

10-16 10:27