24

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

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

我没有被困在一个特定的问题或任何事情上。我只想学习如何扩展本机对象,或者在本例中,来自 Node.js 中的第 3 方模块的对象

4

2 回答 2

38

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

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
};

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

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

于 2013-08-19T06:37:08.893 回答
3

正如怪异的回答,您可以向原型添加一个方法。但是,它无法访问已创建对象的其他成员。如果您想获得该访问权限,则需要更进一步。这是一个完整的例子:

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});
    },
  },
});

这样,您可以像这样创建您的 express 对象:

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

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

于 2018-12-17T12:23:15.493 回答