2017-12-12 3 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()과 장식을 덮어 쓰기의 방법을 찾고 싶습니다 내 자신의 방법을 가진 수업도.

나는 MongoStore을 덮어 쓰려고하는데 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 
    }) 
}));