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

时间:2013-08-18 22:56:04

标签: javascript node.js oop express

对于每个中间件,Express都会传递resreq个对象。这些对象分别扩展了来自http.ServerResponsehttp.ClientRequest的原生对象。我想知道是否可以覆盖或扩展响应对象的方法。

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

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

3 个答案:

答案 0 :(得分:30)

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

var express = require("express");

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

每个res对象都应该可以访问此函数。

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

<强>表达/ LIB / response.js

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

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

res.__proto__ = app.response;

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

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

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

答案 1 :(得分:9)

只需添加一个将customRender功能添加到res的中间件。

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

答案 2 :(得分:1)

freakish answered一样,您可以向原型添加方法。但是,它无权访问所创建对象的其他成员。 如果您想拥有该访问权限,则需要更进一步。这是一个完整的例子:

const express = require('express');

const myExpress = Object.create(express().response, {
  data: {
    value: function(data) {
      return this.status(200).json({status: true, data: data});
    },
  },
  message: {
    value: function(msg) {
      return this.status(200).json({status: true, message: msg});
    },
  },
});

这样,您可以像下面这样创建表达对象:

const app = express();
app.response = Object.create(myExpress);

从响应对象中,您将可以直接调用messagedata函数。