从模块

时间:2017-12-12 15:59:05

标签: javascript express ecmascript-6

我试图从模块覆盖一个类(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类中更改和添加方法的最佳方法是什么?

2 个答案:

答案 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(…) { … } };
};