一尘不染

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

node.js

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

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

我没有遇到任何特定问题或其他任何问题。我只是想学习如何扩展本机对象,或者像本例一样,扩展来自Node.js中第三者模块的对象


阅读 257

收藏
2020-07-07

共1个答案

一尘不染

最好的主意是在响应对象的原型中添加一个自定义方法:

var express = require("express");

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

每个res对象都应该可以访问此功能。

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

express / lib / response.js

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

这个对象成为新创建的响应对象(来自connect框架)的原型:

res.__proto__ = app.response;

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

但是被警告。首先,__proto__它不是EcmaScript的一部分(在其他JavaScript实现中可能不可用)。其次:通常,您将使用继承Object.create__proto__直接在对象上设置是猴子修补,通常是不好的做法,它可能会破坏很多东西)。在此处阅读有关此内容的更多信息:

https://developer.mozilla.org/zh-
CN/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain

2020-07-07