validator.js 1.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
import CronParser from 'cron-parser'
import { replaceWeekName } from './tabs/const'

export default (rule, value, callback) => {
  // 没填写就不校验
  if (!value) {
    callback()
    return true
  }
  const values = value.split(' ').filter(item => !!item)
  if (values.length > 7) {
    callback(new Error('Cron表达式最多7项!'))
    return false
  }
  // 检查第7项
  let e = value
  if (values.length === 7) {
    const year = replaceWeekName(values[6])
    if (year !== '*' && year !== '?') {
      let yearValues = []
      if (year.indexOf('-') >= 0) {
        yearValues = year.split('-')
      } else if (year.indexOf('/')) {
        yearValues = year.split('/')
      } else {
        yearValues = [year]
      }
      // console.info(yearValues)
      // 判断是否都是数字
      const checkYear = yearValues.some(item => isNaN(item))
      if (checkYear) {
        callback(new Error('Cron表达式参数[年]错误:' + year))
        return false
      }
    }
    // 取其中的前六项
    e = values.slice(0, 6).join(' ')
  }
  // 6位 没有年
  // 5位没有秒、年
  let result = true
  try {
    const iter = CronParser.parseExpression(e)
    iter.next()
    callback()
  } catch (e) {
    callback(new Error('Cron表达式错误:' + e))
    result = false
  }
  return result
}