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

24
每个Express中间件都会传递一个res和一个req对象。这些对象扩展了分别来自http.ServerResponsehttp.ClientRequest的本地对象。我想知道是否可以覆盖或扩展响应对象的方法。
例如,我想用自定义方法“customRender”扩展res,并像这样使用它:res.customRender(),而不是res.render('home', jsonData);
我没有遇到特定的问题或任何事情。我只是想学习如何扩展本地对象或在Node.js中来自第三方模块的对象,就像这种情况一样。
2个回答

40

最好的做法是向响应对象的原型中添加自定义方法:

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/en-US/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain


这个不起作用。在可调用函数内部,上下文this将是导出的函数而不是response对象。 - r3wt
你也可以以同样的方式扩展已构建的 express 实例(而不是 express 构造函数)。 例如:var app = express(); app.response.foo = function() { console.log('foo');} - Porlune

3

freakish所回答,您可以向原型添加一个方法。但是,它将无法访问创建的对象的其他成员。 如果您想要访问这些成员,您需要更进一步。以下是一个完整的示例:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接