对于每个中间件,Express都会传递res
和req
个对象。这些对象分别扩展了来自http.ServerResponse
和http.ClientRequest
的原生对象。我想知道是否可以覆盖或扩展响应对象的方法。
例如,我想使用名为customRender的自定义方法扩展res.render('home', jsonData);
,而不是res
,而是像res.customRender()
一样使用它。
我没有遇到某个特定问题或任何问题。我只是想学习如何扩展本机对象,或者像本例中那样,来自Node.js中的第三方模块的对象
答案 0 :(得分:30)
最好的想法是将自定义方法添加到响应对象的原型中:
var express = require("express");
express.response.customRender = function() {
// your stuff goes here
};
每个res
对象都应该可以访问此函数。
您可以阅读源代码以了解它们如何扩展本机对象。基本上他们正在做原型链接:
<强>表达/ LIB / response.js 强>
var res = module.exports = {
__proto__: http.ServerResponse.prototype
};
此对象成为newely创建的响应对象(来自连接框架)的原型:
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
答案 1 :(得分:9)
只需添加一个将customRender功能添加到res的中间件。
function(req, res, next) {
res.customRender = function() {
// implement your custom renderer
}
next();
}
答案 2 :(得分:1)
与freakish answered一样,您可以向原型添加方法。但是,它无权访问所创建对象的其他成员。 如果您想拥有该访问权限,则需要更进一步。这是一个完整的例子:
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
函数。