在Express和Node.js中,是否可以扩展或覆盖响应对象的方法?

通过每个中间件,Express传递一个res和一个req对象。 这些对象分别扩展来自http.ServerResponsehttp.ClientRequest的本地对象。 我想知道是否有可能重写或扩展响应对象的方法。

例如,而不是res.render('home', jsonData); ,我想用一个名为customRender的自定义方法来扩展res ,并像这样使用它: res.customRender()

我没有被困在一个特定的问题或任何东西。 我只想学习如何扩展本地对象,或者像本例一样,来自Node.js中第三方模块的对象

最好的办法是将自定义方法添加到响应对象的原型中:

 var express = require("express"); express.response.customRender = function() { // your stuff goes here }; 

这个函数应该可以被每个res对象访问。

您可以阅读源代码以查看它们如何扩展本机对象。 基本上他们正在做原型链:

快递/ lib目录/ response.js

 var res = module.exports = { __proto__: http.ServerResponse.prototype }; 

而这个对象成为新创build的响应对象(来自连接框架)的原型:

 res.__proto__ = app.response; 

app.response只是上面定义的res的别名)。 请注意, __proto__属性是对对象原型的引用。

被警告。 首先__proto__不是EcmaScript的一部分(它可能在其他JavaScript实现中不可用)。 其次:通常你会用Object.create来inheritance(直接在对象上设置__proto__是一个猴子修补,这通常是一个坏习惯,它可能会破坏很多东西)。 阅读更多关于这里:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain

只需添加一个中间件,将customRender函数添加到res。

 function(req, res, next) { res.customRender = function() { // implement your custom renderer } next(); }