routefilter.emb
Version:
路由过滤中间件 ,注入在 request 一组 过滤器。可实现请求过滤器,和在过滤器中实现请求和返回,实现RMVC中把请求脱离出去
185 lines (153 loc) • 6.39 kB
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>