我无法使它正常工作:
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/