添加新方法到node.js http.ServerResponse.prototype不起作用

时间:2017-09-28 13:53:58

标签: javascript node.js http prototype middleware

作为我学习Node内部的一部分,我试图在Node响应原型中添加一些基本功能,而不需要一些外部库。它不应该是一项艰巨的任务,但是,响应永远不会传递给新函数,永远不能通过 this 语句检索。这是将模板呈现函数绑定到服务器响应的示例。

const http = require('http');

const newMethods = Object.create(http.ServerResponse.prototype);

newMethods.render = async (view, data) => {
    const renderResult = await aTemplateLibray(view, data);
    this.writeHead(200, {'Content-Type': 'text/html'});
    this.end(renderResult);
}
// Other methods here...

// Then
Object.assign(http.ServerResponse.prototype, newMethods);

module.exports = http;

一旦我使用这个http服务器,我可以使用新的渲染功能,但响应没有传递给它,所以会抛出一条错误信息,比如 this.writeHead不是函数

我也尝试使用Object.defineProperty方法。

Object.defineProperty(http.ServerResponse.prototype, 'render', 
    {writable: true,
     enumerable: true,
     get: return this.socket.parser.incoming
    });

我发现一些旧库使用旧的 __ defineGetter __ 方法返回该套接字,我使用新表单对其进行测试,但它也无法正常工作。

1 个答案:

答案 0 :(得分:0)

主要问题是你使用箭头函数表达式(=>),它对this指向函数内部的内容有特殊影响(更多关于here

在您的情况下,您想使用async function(...)

newMethods.render = async function(view, data) {
    const renderResult = await aTemplateLibray(view, data);
    this.writeHead(200, {'Content-Type': 'text/html'});
    this.end(renderResult);
}