UNPKG

routefilter.emb

Version:

路由过滤中间件 ,注入在 request 一组 过滤器。可实现请求过滤器,和在过滤器中实现请求和返回,实现RMVC中把请求脱离出去

185 lines (153 loc) 6.39 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <script> function Filter2(data, res) { console.log('2.', data, res); return Date.now(); } function _Filter1(data) { console.log('1', data); return Date.now(); } // 注册全局过滤执行器 多个 // registerExecutor([Filter1]); // 注册全局过滤执行器 多个 registerExecutor([_Filter1, Filter2]); // registerExecutor(_Filter1); // 注册全局过滤执行器 单个 // registerExecutor(_Filter1); // 定制自己的filter registerExecutor({ fn: (isA) => { console.log(isA ? isA : '无参数') return Date.now(); } }, true); function registerExecutor(filterObject) { let isRequest = false; function fn(req, res, next) { isRequest = !!req /// 过滤器对象 let filter = {} // 如果是对象 定制filter if (!(typeof filterObject === "function") && !(filterObject instanceof Array)) { filter = { ...filterObject, ...filter } } // 函数直接挂载可执行 else { if (typeof filterObject === "function") { filterObject = [filterObject] } // 如果是数组进行遍历 if (filterObject instanceof Array && typeof filterObject === 'object') { // 挂载执行函数结果 filterObject.forEach(filterItem => { if (filterItem.name[0] === "_") { filter[filterItem.name] = function () { return new Promise((resolve, reject) => { try { resolve(filterItem.apply(this, arguments)) } catch (error) { reject({ isVail: false, msg: filterItem.name + '过滤器 执行失败', erro: error }) } }) } filter[filterItem.name + '_'] = filter[filterItem.name]() } //非直接执行执行器注册 else { filter[filterItem.name] = function () { return new Promise((resolve, reject) => { try { resolve(filterItem.apply(this, arguments)) } catch (error) { reject({ isVail: false, msg: filterItem.name + '过滤器 执行失败', erro: error }) } }) } } // filter = { // get [filterItem.name]() { // return filter['_' + filterItem.name]() // }, // ...filter // } }) } else { throw new Error(' 是不是 参数传递错了?要看看文档?https://www.npmjs.com/package/routefilter.emb ') } } req = isRequest ? req : {}; // 合并request 上的执行器 filter = req.Executor ? { ...filter, ...req.Executor } : filter // 合并window 上的执行器 filter = window && window.Executor ? { ...filter, ...window.Executor } : filter ExecutorPrx = new Proxy(filter, { get: function (target, property) { return target[property]; } }) window.Executor = req.Executor = ExecutorPrx return req; } if (isRequest) { return fn } else { return new Promise((resolve, reject) => { resolve(fn()) }) } // Object.setPrototypeOf(window._filter, { // get _filter() { // return (window._filter ? { // ...window._filter, // ...req.filter // } : req.filter) // } // }) // window = { // get _filter() { // return (window._filter ? { // ...window._filter, // ...req.filter // } : req.filter) // }, // ...window // } } if (typeof module === "object" && typeof module.exports === "object") { module.exports = registerExecutor } else { if (window) { window.registerExecutor = registerExecutor } else { throw new Error("无法使用浏览器环境") } } </script> </body> </html>