我有一个导出少量功能的模块。我想为模块编写一个中间件。因此,当调用该模块的任何导出函数时,我希望中间件首先执行并决定是否应该执行预期函数。
我正在使用typescript并想到导出执行相同方法的模块:
export {
foo: middleware
bar: middleware
baz: middleware
}
这可能不是编写中间件的正确方法。你能建议更好的方法吗?
答案 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之前将它们包装起来