2017-12-12 16 views
0

モジュール(connect-mongo)からクラスを上書きしようとしています。モジュールからのES6クラスの上書き/装飾

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ファイルを作成しようとしましたが、私は見えません。私は、connect paramに基づいて、MongoStoreクラスが動的に構築される方法について特に混乱しており、これを回避する方法はわかりません。

MongoStoreクラス内でメソッドを変更して追加するにはどうすればよいでしょうか?

+0

あなたは 'server.js'かどうかを編集することはできますか? – Bergi

+0

@Bergiはい、私はすべてを編集できます。可能であれば、パッチを自分のファイルに入れておきますが、それだけです。 – alexcs

+0

説明していることは、賢明なOOPのことであるクラスを拡張しようとしているように聞こえます。 – apokryfos

答えて

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(…) { … } }; 
}; 
+0

これはまさに私を逃していたパターンです。 'server.js'では、const MongoStore = require( '/ route/to/mypatch.js')(セッション)を正しく実行する必要があります。それが私にとって理にかなっているし、少なくとも私はそれをどのように働かせたのだろうか。 – alexcs

+0

おっと、それを調整するのを忘れました、本当にはい。 – Bergi

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 
    }) 
})); 
関連する問題