在Express和Node.js中,是否可以扩展或覆盖响应对象的方法?
通过每个中间件,Express传递一个res
和一个req
对象。 这些对象分别扩展来自http.ServerResponse
和http.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(); }