egg-input-regex-filter
Version:
filter data which from user side use regex, and returns a result data whose format is declared by coder.
97 lines (91 loc) • 3.54 kB
JavaScript
class Filter {
/**
* 过滤操作,返回对象 包括过滤后的数据对象 及检测结果
* 返回(return ):
* {
* data: {filter之后的dataObj },
* err: {}/{key:[{...}, ...] } //空对象 或key值关联的对象数组 的对象
* }
*
* 示例(sample ):
* var obj = {name: 'dzhukf', age: 20 },
* filter = {
* name: [
* {re: /{5,}/, errCode: -1, errMsg: '长度至少为5位'},
* {re: /^z/, errCode: -2, errMsg: '必须以z开头'},
* ]
* }
*
* 运行(and run ): Filter.doFilter(obj, filter, false )
*
* 结果(sample return ) :
* {
* data: {name: null, age: 20 },
* err: {
* name: [{errCode: -2, errMsg: '必须以z开头' }, ... maybe more ],
* ...maybe more
* }
* }
*
* Filter::doFilter(obj, filter )
*
* @param dataObj: {key: val , key: val ... }
* @param regexObj: {key: [{re: /xx/ , errCode: 21, errMsg: 'xxx'}, ... ], ... }
* @param quickRtn: true/false
* @param rtnFn: 用户自定义 错误返回数据格式
*/
static doFilter(dataObj, regexObj, quickRtn = true, rtnFn = null ) {
//dataObj = JSON.stringify(dataObj )
//dataObj = eval("(" + dataObj + ")" )
if(!dataObj ) return {data: {}, err: [] } //传入对象为空
if(!regexObj ) return {data: dataObj, err: [] } //过滤器为空
var rtnData = {retData: {}, err: {}},
failedMatch = [] // 参数值 不匹配正则
for(var i in regexObj ) {
if(regexObj[i].length == 0 ) continue
if(dataObj[i] == undefined ) dataObj[i] = ''
regexObj[i].forEach(function(val ){
if(!dataObj[i].toString().match(val.re) ) {
if(rtnData.err[i] == undefined ) rtnData.err[i] = []
rtnData.err[i].push({errCode: val.errCode, errMsg: val.errMsg } )
if(failedMatch[i] == undefined ) failedMatch.push(i )
}
})
if(quickRtn && rtnData.err[i] != undefined && rtnData.err[i].length > 0 ) break
}
failedMatch.forEach(function(item ) {
dataObj[item] = null
})
rtnData.retData = dataObj
return rtnFn ? rtnFn(dataObj, rtnData.err ) : rtnData
}
/***
* 标准JSON返回输出 (a startand json return format )
*
* @param code : a return code of business logic
* @param data : return data
* @param errMsg : an error message
* @param okCode : if code is eq this code , errMsg will not be seted .
*/
static jsonRtn(code, data = {}, errMsg = '', okCode = 0 ) {
var rtnData = { code: code, data: data }
if(code != okCode ) rtnData.data.errMsg = errMsg
return JSON.stringify(rtnData )
}
/**
* return a json to client for input-filter
* 将接收到的用户错误提交 转成浏览器返回的数据形式
* @param errMsgObj
* @returns {*}
*/
static errToRtn(errMsgObj ) {
var errRtn = {}, rtnDt
for(var i in errMsgObj ) {
errRtn = errMsgObj[i][0]; break
}
(rtnDt = {}) && (rtnDt.data = {} )
&& ({errCode: rtnDt.code, errMsg: rtnDt.data.errMsg } = errRtn )
return rtnDt
}
}
module.exports = Filter