当前位置: 首页 > 面试题库 >

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

羊舌青青
2023-03-14
问题内容

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

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

这个对象成为新创建的响应对象(来自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



 类似资料:
  • 问题内容: 如果要覆盖django中应用程序随附的模板(在app / templates / app /中),请在另一个目录中创建相同名称的模板,模板加载器会在应用程序的模板目录之前检查该模板。如果您只想覆盖模板的某些块,则还必须复制整个模板广告,更改该块,这实际上不是很干。 有人知道一种方法来覆盖原始模板,同时扩展它,以便您只需要覆盖要更改的特定块吗?(这样做是在不更改模板名称的情况下进行的,因

  • 问题内容: 说我有一个像这样的课程: 它具有一个带有扩展它的类的层次结构: 然后在其他地方,我有一堂课利用了这些东西: 我是否可以指定A的子类,以便使用更具体的“某物”类覆盖setSomething方法?这就是我想要做的: 目前,我正在A类中执行以下操作: 如果SuperSomething的类型不适合这些类,则B类和C类在checkClass方法中引发异常。 编辑:我已经尝试使用上述确切的方法签名

  • 假设我有一个这样的类: 假设我稍后创建了一个Foo对象,并选择覆盖f1的方法定义,如下所示: 如果我尝试: 我得到: 当然,我正努力让“我的f1”出版。我也希望f1是可选的。这是怎么回事?有没有可能在namedtuple中定义一个方法的默认实现,然后在new中重写它?

  • 问题内容: 你能 声明这样 的函数吗? 然后像这样 重新声明 它… 这样可以覆盖函数吗? 可以吗 问题答案: 编辑 解决此答案未直接解决原始问题的评论。如果您是通过Google搜索到达的,请从此处开始 有一个名为override_function的函数可以实际使用。但是,由于此函数是Advanced PHP Debugger扩展的一部分,因此很难为生产使用提供参数。因此,我要说“否”,不可能以原始

  • 我有一个节点。js应用程序,将一些配置信息附加到对象: TypeScript 编译器不喜欢这样,因为 类型没有名为 的对象: TS2339:类型“Global”上不存在属性“myConfig”。 我不想这样做: 我如何扩展< code>Global类型以包含< code>myConfig或者只是告诉TypeScript闭嘴并相信我?我更喜欢第一个。 我不想更改中的声明。我看到了这篇SO帖子,并尝试

  • 问题内容: 我有一个node.js应用程序,该应用程序将一些配置信息附加到该对象: TypeScript编译器不喜欢这样,因为该类型没有名为的对象: TS2339:类型“ Global”上不存在属性“ myConfig”。 我不想这样做: 如何扩展类型以包含或只是告诉TypeScript关闭并信任我?我希望第一个。 我不想更改其中的声明。我看到了这样的帖子,并尝试了这个: 作为扩展现有接口的一种方