2017-08-03 12 views
0

私はいくつかの関数をエクスポートするモジュールを持っています。私はモジュールのためのミドルウェアを書いてみたいです。したがって、そのモジュールからエクスポートされた関数が呼び出されると、ミドルウェアが最初に実行し、目的の関数を実行するかどうかを決定します。複数の関数をエクスポートするモジュール用のミドルウェアロジックを書くにはどうすればいいですか?

export { 
foo: middleware 
bar: middleware 
baz: middleware 
} 

書き込みミドルウェアの正しい方法ではないかもしれません。
私はtypescriptですと、このように同じメソッドを実行するモジュールをエクスポートするの考えを使用しています。より良いアプローチを提案できますか?

答えて

1

最も簡単な方法は、関数を明示的にラップすることです。 ES6(活字体に直接移植する必要があります)では:

export default { 
    foo: wrapMiddleware(fooMiddleware), 
    bar: wrapMiddleware(barMiddleware) 
} 

wrapMiddleware()は次のようになります。

function wrapMiddleware(originalFunc) { 
    return function(...args) { 
     // Example: 
     if (condition) { 
      return originalFunc(...args) 
     } else { 
      return null 
     } 
    } 
} 

あなたにも、プログラムでこれを行うことができます。たとえば、

let exports = { foo, bar } 

for (let key in exports) { 
    exports[key] = wrapMiddleware(exports[key]) 
} 
+0

で輸出1前にそれらをラップすることはできませんより多くの方法をエクスポートするには、このようなすべてのミドルウェアを書く方が良いアプローチだと思いますか? –

+0

これは同じように見えるいくつかのコードにつながる場合でも、これはよりクリーンな方法だと思います。コードを垂直に整列させると(同じ列に 'wrapMiddleware'を呼び出す)、テーブルのように見え、読みやすくなります。しかし、それはプログラムで行うことができます、私は上記の質問を編集します – slezica

+0

これは良いです。しかし、私は名前空間から関数をエクスポートする必要があります。名前空間からオブジェクトをエクスポートする他のソリューションはありますか? –

0

@slezica answerで展開します。 es6のエクスポートは静的なので、依存関係をどのようにエクスポートするか、作成時にリストする必要性については、それほど創造的ではありません。 commonJSを使用すると、オブジェクトをエクスポートして、どのようにエクスポートするかを柔軟にすることができます。(機能的なアプローチを無視して、コーディングスタイルにするなど、さまざまな方法で行うことができます。

`` `

import * as fns1 from functions; 
import * as fns2 from functions; 
import toPairs from 'lodash/toPairs'; 
import fromPairs from 'lodash/fromPairs'; 
import map from 'lodash/map'; 
import flowRight from 'lodash/flowRight'; 
import curryRight from 'lodash/curryRight'; 

const applyMiddlewareToModule = module => (
    flowRight(// lodash's version of compose 
    fromPairs, // convert back to object 
    // maps the function from fn to middleware wrapped fn 
    curryRight((map)(([fnName, fn]) => [fnNane, wrapMiddleware(fn)])), 
    toPair // convert the provided object to an array of [key, value] 
) 
) 

module.exports = { 
    ...applyMiddlewareToModule(fns1), 
    ...applyMiddlewareToModule(fns2) 
} 

` ``

いますが、ES6モジュールに固執する場合、私は10を持っている場合は、あなたが1

関連する問題