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

M.K*_*afi 20 javascript oop node.js express

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

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

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

fre*_*ish 32

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

var express = require("express");

express.response.customRender = function() {
    // your stuff goes here
};
Run Code Online (Sandbox Code Playgroud)

并且每个res对象都应该可以访问此函数.

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

快递/ lib目录/ response.js

var res = module.exports = {
  __proto__: http.ServerResponse.prototype
};
Run Code Online (Sandbox Code Playgroud)

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

res.__proto__ = app.response;
Run Code Online (Sandbox Code Playgroud)

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

但请注意.首先,__proto__它不是EcmaScript的一部分(它可能在其他JavaScript实现中不可用).其次:通常你会做继承Object.create(__proto__直接设置一个对象是一个猴子修补,这通常是一个不好的做法,它可能会打破很多东西).在这里阅读更多相关信息:

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


Ben*_*ber 9

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

function(req, res, next) {
  res.customRender = function() {
    // implement your custom renderer
  }
  next();
}
Run Code Online (Sandbox Code Playgroud)

  • 这将为每个响应创建一个新函数,最好使用`util.inherits`并将其添加到原型中一次. (12认同)
  • 或者将函数赋值给variable并赋值res.customRenger = fn; (如果你需要req,res,请打包电话,下一个) (2认同)