如何使用/引用在相同json模式中生成的字段值

时间:2019-03-01 08:12:51

标签: javascript json jsonschema faker json-server

我正在尝试通过结合使用json-serverjson-schema-faker来创建模拟数据。

我试图使用$ref属性,但是我知道这仅引用类型,而不是确切的值。

是否有一种方法可以重用完全相同的值,而不仅仅是其类型?

我在mockDataSchema.js文件中拥有的架构是:

var schema =
{
    "title": "tests",
    "type": "object",
    "required": [
        "test"
    ],
    "properties": {
        "test": {
            "type": "object",
            "required": [
                "id",
                "test2_ids",
                "test3"
            ],
            "properties": {
                "id": {
                    "type": "string",
                    "faker": "random.uuid" // here
                },
                "test2_ids": {
                    "type": "array",
                    "items": {
                        "type": "string",
                        "faker": "random.uuid" // here
                    }
                },
                "test3": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string",
                                "faker": "random.uuid" // here
                            }
                        }
                    }
                }
            }
        }
    }
};

module.exports = schema;

从这个模式中,我希望id在我用注释// here指示的所有三个位置都相同。

请注意,我无法使用enumconst,因为我想多次出现tests

test2_ids将是一个数组,所以我想为第一个id以及相同类型的其他值包括该特定的id。

id的{​​{1}}中,我只想要与test3的{​​{1}}完全相同的值。

我要实现的目标可行吗?

或者是否可以更改id文件中的这些数据,而不是更改包含该模式的test中的数据?

我的generateMockData.js

mockDataSchema.js

1 个答案:

答案 0 :(得分:0)

我想在这里分享我找到的解决方案。就我而言,我需要使用password为字段password_confirmationjson-schema-faker生成相同的值,而对我有用的是,在faker库中分配一个新属性,然后放入伪造者模式中的新属性名称。这里的代码:

import faker from 'faker';
import jsf from 'json-schema-faker';

// here we generate a random password using faker
const password = faker.internet.password();
// we assign the password generated to a non-existent property, basically here you create your own property inside faker to save the constant value that you want to use.
faker.internet.samePassword = () => password;
// now we specify that we want to use faker in jsf
jsf.extend('faker', () => faker);
// we create the schema specifying the property that we have created above
const fakerSchema = {
   type: 'object',
   properties: {
      password: {
         faker: 'internet.samePassword',
         type: 'string'
      },
      password_confirmation: {
         faker: 'internet.samePassword',
         type: 'string'
      }
   }
};
// We use the schema defined and voilá!
let dataToSave = await jsf.resolve(fakerSchema);


/*
This is the data generated
{
   password: 'zajkBxZcV0CwrFs',
   password_confirmation: 'zajkBxZcV0CwrFs'
}
*/