我试图从模块覆盖一个类(connect-mongo)。该模块大致类似于:
在server.js
:
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);
// ...
app.use(session({
store: new MongoStore({ mongooseConnection: mongoose.connection })
}));
模块的源index.js
如下所示:
module.exports = function (connect) {
const Store = connect.Store || connect.session.Store
const MemoryStore = connect.MemoryStore || connect.session.MemoryStore
class MongoStore extends Store {
constructor(options) {
// construction logic
}
methodA() {
// method logic
}
// More props and methods
}
return MongoStore;
}
我想找到一种覆盖模块methodA()
并用自己的方法装饰类的方法。
我尝试创建myPatch.js
文件,尝试覆盖MongoStore
,但我似乎无法做到。我特别感到困惑的是MongoStore
类是如何基于connect
参数动态构造的,我不知道如何解决这个问题。
在MongoStore
类中更改和添加方法的最佳方法是什么?
答案 0 :(得分:2)
创建扩展MongoStore
的自己的类然后编辑所需的属性可能会更容易。
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);
class MyCustomMongoStore extends MongoStore {
constructor(props) {
// pass any properties to MongoStore class (eg. connection)
super(props);
// add your own properties
this.customProp = props.customProp;
}
methodA() {
// your logic
}
customMethod() {
// your method
}
}
// ...
app.use(session({
store: new MyCustomMongoStore({
mongooseConnection: mongoose.connection,
customProp: yourCustomProperty
})
}));
答案 1 :(得分:1)
您需要改变/扩展动态构造返回的类对象。
// server.js:
const session = require('express-session');
const MongoStore = require('patched-connect-mongo')(session);
…
// patched-connect-mongo.js
const originalConnectMongo = require('connect-mongo');
module.exports = function (session) {
const OriginalMongoStore = originalConnectMongo(session);
…
// here, either OriginalMongoStore.prototype.methodA = function(…) { … };
// and return OriginalMongoStore
// or do return class MyMongoStore extends OriginalMongoStore { methodA(…) { … } };
};