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

In Express and Node.js, is it possible to extend or override methods of the response object?

本文关键字:覆盖 扩展 响应 对象 方法 Node Express js 是否      更新时间:2023-09-26

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

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

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

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

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

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

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函数。