如何为导出多个功能的模块编写中间件逻辑

时间:2017-08-03 13:23:12

标签: javascript ecmascript-6 typescript2.0 es6-modules

我有一个导出少量功能的模块。我想为模块编写一个中间件。因此,当调用该模块的任何导出函数时,我希望中间件首先执行并决定是否应该执行预期函数。
我正在使用typescript并想到导出执行相同方法的模块:

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

这可能不是编写中间件的正确方法。你能建议更好的方法吗?

2 个答案:

答案 0 :(得分:1)

最简单的方法是明确地包装你的函数。在ES6中(应该可以直接移植到Typescript):

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])
}

答案 1 :(得分:0)

扩展@slezica的答案。 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模块,那么您必须在导出1之前将它们包装起来