在Express和Node.js中,是否可以扩展或覆盖响应对象的方法
In Express and Node.js, is it possible to extend or override methods of the response object?
对于每个中间件,Express都会传递一个res
和一个req
对象。这些对象分别扩展了来自http.ServerResponse
和http.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);
从响应对象中,您将能够直接调用message
和data
函数。
- 可扩展的画布作为Google Maps Javascript API中的覆盖
- MDN文档中关于弄清楚XUL元素的段落是什么意思:“如何将覆盖扩展转换为无重启”
- MonkeyPatching:PrimeFaces小部件扩展/覆盖
- 从引导的扩展中绘制UI覆盖
- 如何在chrome扩展中的新选项卡上加载url覆盖的脚本
- javascript原生原型:扩展、添加和覆盖方法
- Chrome.storage.sync 在重新加载扩展程序时会被覆盖
- 主干:调用扩展视图的覆盖 render() 函数
- 如何在 Sails 中扩展蓝图的功能.js而不覆盖整个蓝图
- 扩展类时继承而不是覆盖属性/方法
- 打字稿覆盖构造函数中的扩展属性
- 在 JavaScript 中扩展或覆盖函数
- 扩展菜单插入带有覆盖的新项目
- Javascript,Chrome 扩展:覆盖 cookie getter 和 setter
- 在 JavaScript 中扩展/覆盖
- 火狐扩展 - 面板元素点击被覆盖
- 如何在完全独立的.js文件中覆盖/扩展原型.js类
- 如何在Chrome的JavaScript中覆盖/扩展ReferenceError
- 在 React.js 中覆盖/扩展 ES7 类的静态属性
- Jquery javascript覆盖/扩展事件