使用 Dreamjs 生成 JSON 伪数据

2019-02-24  本文已影响3人  binyu1231

基本使用

github: https://github.com/adleroliveira/dreamjs

$ yarn add dreamjs -D

# or 

$ npm i dreamjs -D
import dream from 'dreamjs'

dream.schema({name: 'name'}).generateRnd().output()
// { name: 'Sam Nichols' }

dream.schema({name: 'name'}).generateRnd(2).output()
// [ { id: 'Maria Porter' }, { id: 'Evan Santiago' } ]

类型

基础的类型

dream.schema('String', { result: String })
dream.schema('Number', { result: Number })
dream.schema('Boolean', { result: Boolean })
dream.schema('Array', { result: Array })
dream.schema('Object', { result: Object })
dream.schema('Function', { result: Function })
dream.schema('Date', { result: Date })

自定义类型

有两种可以自定义类型的方式

  1. 直接写正则表达式

dreamjs 依赖 randexp 实现正则表达式的转换

dream.schema('order', {
  orderId: /[A-Z]{3}[0-9]{4,10}/,
  state: /(1|2)/,
  image: /http:\/\/www\.\w{6}\.(com|cn|cc)\/\w{4,10}\.(png|jpg|gif)/
})
.generateRnd()
.output()

/*
{ 
  orderId: 'YCX85258',
  state: '1',
  image: 'http://www.0unc5Z.cn/9HQTx.gif' 
}
*/
  1. 使用 dream.customType 方法
// 自增id
// 需要注意的是`自增id`依赖上一个项目的 id 字段,也就是说 key 必须为 id 才能使用 'plusId' 这个类型
dream.customType('plusId', helper => {
  return helper.previousItem ? helper.previousItem.id + 1 : 1
})

// 工作日
// oneOf 是helper 的内置函数,内部使用 lodash 中的 sample 函数来随机获取集合中的一个元素
// _.sample <https://www.lodashjs.com/docs/4.17.5.html#sample>
dream.customType('businessDays', helper => {
  return helper.oneOf(['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'])
})

dream.schema({
  id: 'plusId',
  day: 'businessDays'
})
.generateRnd(3)
.output()

/*
[ { id: 1, day: 'Wednesday' },
  { id: 2, day: 'Tuesday' },
  { id: 3, day: 'Tuesday' } ]
*/

helper 中另一个内置属性是 helper.chance 它是 chance 库的实例,使用方法在下方预定义类型中有介绍

预定义的类型

有很多比较常用的模板比如城市(city),年龄(age)这些东西,dreamjs 在内部引用了 chance 库来实现。比如

const personSchema = dream.schema('person', {
  name: 'name',
  city: 'city',
  age: 'age'
  // ...
})

但需要注意的是,dreamjs 默认只能使用 chance 库原型链方法的无参形式

temporaryValue = (typeof (chance[propertyType]) === 'function') ? 
                 chance[propertyType]() : 
                 '[Unknown Custom Type]';

如果要使用 chance 高级功能,可以在customType 中的 helper 中访问到 chance

dream.customType('childrenAge', helper => helper.chance.age({ type: 'child' }))

chance 的官方网站: http://chancejs.com/

类型的组合使用


dream.schema('orderList', {
  id: String,
  subOrder: [Number, Number, Number],
  data: {
    owner: 'name',
    city: ['country', 'city'],
    address: 'address'
  }
})
.generateRnd(2)
.output()


/*
[
  {
    "id":"LTMWymda7ct8)V(Y&",
    "subOrder":[995639840210944,1561101036683264,3440815498067968],
    "data":{
      "owner":"Isaiah Holt",
      "city":["KR","Zabawi"],
      "address":"1444 Pavam Park"
    }
  },{
    "id":"pPNalegUq)Q(GgrmV@V7",
    "subOrder":[5977717554020352,511086627389440,2681794893709312],
    "data":{
      "owner":"Edgar Thornton",
      "city":["SR","Lelavur"],
      "address":"1933 Fiwer Heights"
    }
  }
]
*/

常用方法

schema([String:name]?, [Object:opt])

useSchema([String:name])


dream.schema('User', {
  name: String,
  age: Number
})

dream.schema('Location', {
  address: String,
  postcode: Number
})

const data = dream
.useSchema('Location')
.generateRnd()
.output()

customType([String:name], [Function:handler])

自定义类型

output(), output([Function:callback])

const data = dream.output()
dream.output((err, result) => {
  if (err) {
    // ...
  }
  else {
    // ...
  }
})

input(Object:PassedData)

通过 input 可以实现自定义数据流,可以再 CustomType 回调中的 helper 使用它

// 官方例子
dream.customType('customTypeWithInput', function (helper) {
  return helper.input.value;
});

dream.input({value: 'Provided by an input'})
.schema({
  result: 'customTypeWithInput'
})
.generateRnd()
.output(function (err, result) {
  console.log(result);
});

// { result: 'Provided by an input' }

generate([Number:count])

generateRnd([Number:count])

这两个函数都会生成给定模式给定数量的实例,generateRnd 会用随机数据填充,generate 只返回空的模式

cleanse()

清除输出和选中的 schema

// source
self.cleanse = function() {
  self._output = null;
  self._selectedSchema = null;
};

注意事项

  1. 每次生成数据时要调用 generateRnd 方法填充数据,默认不填充
上一篇下一篇

猜你喜欢

热点阅读