【问题标题】:Can I use an http.ServerResponse as a prototype in node.js?我可以在 node.js 中使用 http.ServerResponse 作为原型吗?
【发布时间】:2010-12-11 05:21:43
【问题描述】:

我无法让它工作:

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

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

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

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

    【讨论】:

    • 非常感谢伊沃。这是有道理的,并且应该是我通过源头寻找一些东西可以找到的东西。我认为要么 (a) res 发生了一些神奇的事情,要么 (b) 我对原型继承的知识存在空白。正如我所怀疑的,后者就是这种情况。我试图完成的是一种代理设计模式,我可以在新对象上只重新定义一个函数,比如 writeHead,对其应用一些“过滤器”,最后调用旧的 res.writeHead。不过,看起来有一种更简单的方法可以做到这一点。
    猜你喜欢
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多