Skip to content

模板语法

DataFaker通过模板来定义数据结构,就像定义一个数据库表那样,每一个数据结构就是一个schema

使用预提供的数据类型

DataFaker 提供了 26 种,200 多个常用数据项,你可以直接使用他们,基本语法为:

  1. 字段:类型字符串
  2. 字段:[类型字符串,方法参数]

如下所示:

ts
const userSchema: ModelSchema = {
  id: 'string.uuid',
  name: 'person.fullName',
  // 数组形式,第一个参数为方法路径,第二个为方法参数
  age: ['number.int', { min: 18, max: 30 }],
};
js
const user = {
  id: faker.string.ulid(),
  name: faker.person.fullName(),
  age: faker.number.int({ min: 18, max: 30 }),
};

自定义数据类型

getter 函数

如果你需要自定义数据,你可以使用一个getter函数来返回你想要的数据,基本语法为:

js
{
  字段: () => {
    return 自定义数据;
  };
}

如下所示:

ts
const userModel = defineModel('user', {
  id: 'string.uuid',
  age: ['number.int', { min: 18, max: 30 }],
  name: () => {
    return `__${faker.person.fullName()}`;
  },
  sex: () => '男',
});

defineModel

defineModelDataFaker 提供的函数,用来定义数据模型,返回一个 DModel 对象。它接受两个参数:

  • 模型名称: string
  • 模型模板: ModelSchema

如果你这么做,这个模型将会被注册到 DataFaker 中,你可以在其他地方使用 fakeData 函数来生成数据。

上下文信息

当然为了保持生成数据的关联性,DataFaker使用了上下文机制,即在getter函数种可以接受一个上下文对象,这个对象包含了前面已经生成的字段数据,这样你在 getter 函数种就可以利用他们来保持数据的关联性了。

比如我希望生成的邮箱数据中使用用户的姓名,这样会让邮箱数据生成的更加合理

ts
const userModel = defineModel('user', {
  id: 'string.uuid',
  age: ['number.int', { min: 18, max: 30 }],
  fName: 'person.firstName',
  lName: 'person.lastName',
  email: (ctx) => {
    // 使用已经生成的fName和lName数据
    return faker.internet.email({ firstName: ctx.fName, lastName: ctx.lName });
  },
});
const users =

可以看到邮箱数据就与 fNamelName 数据关联了起来

bash
{
  id: '1cdef7cf-76f7-459f-a250-3823cad6ead1',
  age: 24,
  fName: 'Brycen',
  lName: 'Johnson',
  email: 'Brycen.Johnson@gmail.com'
}

引用数据类型

基本语法

DataFaker 支持引用数据类型,即你可以在一个数据结构中引用另一个数据结构,这样可以让数据结构更加灵活,基本语法为:

ts
{
  字段: {
    refModel: '模型名称' | '模型对象';
    // 生成数量
    count?: number;
    // 递归深度
    deep?: number;
  },
  // 或者,此时count和deep属性默认为1
  字段:'模型名称' | '模型对象'
}

引用其它模型

比如下面的案例中用户模型引用了地址模型,这样可以生成用户模型时同时生成地址模型的数据

ts
// 地址模型
const addressModel = defineModel('address', {
  country: 'location.country',
  city: 'location.city',
});
// 用户模型
const userModel = defineModel('user', {
  id: 'number.int',
  firstName: 'person.firstName',
  secondeName: 'person.lastName',
  age: ['number.int', { min: 18, max: 65 }],
  hobby: ['helpers.arrayElements', ['篮球', '足球', '乒乓球', '羽毛球']],
  email: ctx => {
    return faker.internet.email({ firstName: ctx.firstName, lastName: ctx.secondeName });
  },
  // 引用地址
  address: addressModel,
  // 带规则
  address2: {
    refModel: 'address',
    count: 3,
  },
});
const userDatas = fakeData(userModel, {
  // 数据两为2
  count: 2,
});
console.log(userDatas);

生成的数据如下

bash
{
  id: 2769029318500197,
  firstName: 'Alvah',
  secondeName: 'Luettgen',
  age: 62,
  hobby: [ '篮球', '羽毛球', '乒乓球' ],
  address: { country: 'Malta', city: 'Konopelskistead' },
  address2: [
    { country: 'Bahamas', city: 'Glen Burnie' },
    { country: 'Gambia', city: 'Port Alden' },
    { country: 'Rwanda', city: 'New Rosannaville' }
  ],
  email: 'Alvah_Luettgen@hotmail.com'
}

自引用

DataFaker同时支持自引用,这在生成树状数据时十分有用,但是要注意,自引用只能使用模型别名,否则会提示循环引用。
下面的案例中将会生成一个树状结构数据:

ts
const addressModel = defineModel('address', {
  country: 'location.country',
  city: 'location.city',
});
const userModel = defineModel('user', {
  id: 'number.int',
  firstName: 'person.firstName',
  secondeName: 'person.lastName',
  age: ['number.int', { min: 18, max: 65 }],
  hobby: ['helpers.arrayElements', ['篮球', '足球', '乒乓球', '羽毛球']],
  email: ctx => {
    return faker.internet.email({ firstName: ctx.firstName, lastName: ctx.secondeName });
  },
  address: addressModel,
  children: {
    // 引用自身,此时必须使用模型别名'user'而不能使用userModel
    refModel: 'user',
    // 控制自引用递归深度
    deep: 3,
  },
});
const userDatas = fakeData(userModel);
console.dir(userDatas, { depth: Infinity });

生成的数据如下:

json
{
  "id": 3104367534645508,
  "firstName": "Emmie",
  "secondeName": "Goyette-Sporer",
  "age": 48,
  "hobby": ["羽毛球", "篮球", "乒乓球"],
  "address": { "country": "Chile", "city": "Samirbury" },
  "children": {
    "id": 6711551880453162,
    "firstName": "Evelyn",
    "secondeName": "Rau",
    "age": 25,
    "hobby": ["乒乓球", "篮球", "足球"],
    "address": { "country": "Sweden", "city": "South Rod" },
    "children": {
      "id": 7905722737546825,
      "firstName": "Haley",
      "secondeName": "Glover",
      "age": 63,
      "hobby": ["篮球", "羽毛球", "乒乓球", "足球"],
      "address": { "country": "Ukraine", "city": "Port Terrell" },
      "children": {
        "id": 3203661997548607,
        "firstName": "Cleta",
        "secondeName": "Bahringer",
        "age": 41,
        "hobby": ["羽毛球", "乒乓球"],
        "address": { "country": "Fiji", "city": "Maggiotown" },
        "children": null,
        "email": "Cleta_Bahringer@gmail.com"
      },
      "email": "Haley_Glover@gmail.com"
    },
    "email": "Evelyn_Rau95@yahoo.com"
  },
  "email": "Emmie.Goyette-Sporer@gmail.com"
}

关于递归深度

当使用自引用时,默认的递归深度为 1,你可以通过 deep 属性来控制递归深度,如果设置为 0 则表示不递归,有关于配置项的信息请参考 数据引用