【问题标题】:Why would faker produce duplicate data?为什么faker会产生重复数据?
【发布时间】:2015-09-11 00:43:03
【问题描述】:

我正在使用 Faker 来为数据库做种,我正在使用 faker 方法和lodash#random

数据生成在一个循环中,但每次执行都会产生完整的重复项,我该如何避免呢?

faker.locale = "es";
var leagueTeams = [{ "name" : "Perú","id" : "t834"},{"name" : "Venezuela","id" : "t833"},{"name" : "Argentina","id" : "t632"},{"name" : "Uruguay","id" : "t837"},{"name" : "Colombia","id" : "t832"},{"name" : "Bolivia","id" : "t836"},{"name" : "Jamaica","id" : "t1723"},{"name" : "Brazil","id" : "t614"},{"name" : "Mexico","id" : "t659"},{"name" : "Ecuador","id" : "t830"},{"name" : "Chile","id" : "t831"},{"name" : "Paraguay","id" : "t835"}]


for (var i = 0; i < 10; i++) {

    var fakeName = faker.name.findName();
    var fakeEmail = faker.internet.email();
    var fakePassword = faker.internet.password();
    var fakeTeam = faker.hacker.phrase();
    var fakeTeamImage = faker.image.imageUrl();
    var fakeFavoriteTeam  = leagueTeams[_.random(0,11)];
    var fakeBirthday = faker.date.past();

    // Create account
    request.post(  {url:'http://localhost:1337/api/v1/auths/login',
                    form:   {
                                email: fakeEmail,
                                password: fakePassword,
                            }
                    },
                    function (err, httpResponse, body) {

                            body = JSON.parse(body);
                            var iduser = body.user.id;
                            var auth = "Bearer " + body.token;

                            // Create team

                            request.put({
                                            url: 'http://localhost:1337/api/v1/users/' + iduser,
                                            form: {
                                                    name: fakeName,
                                                    gender: ['male','female'][i%2],
                                                    team: {name: fakeTeam, image: fakeTeamImage},
                                                    fanOf: {
                                                        name: fakeFavoriteTeam.name,
                                                        id: fakeFavoriteTeam.id
                                                    },
                                                    birthDate: fakeBirthday,
                                                    iduser: iduser
                                            },
                                            headers: {"Authorization": auth}
                                        },
                                        function (err, httpResponse, body) {
                                            console.log(body);
                                        }
                            );
                    });
}

所以像 faker.internet.findName()faker.hacker.phrase() 或使用 lodash var fakeFavoriteTeam = leagueTeams[_.random(0,11)]; 的语句这样的整个伪造方法总是产生相同的结果,我该如何改进它?

【问题讨论】:

    标签: node.js random lodash seeding faker


    【解决方案1】:

    在 JavaScript 中,for 循环中的 var i like 语句被声明为全局变量,request[method] 不是块代码。 这意味着除非循环内没有块代码,否则它将继续更改。

    在循环内声明局部变量的一种方法是使用let(ES6 特性)。

    在没有块代码的循环中使用let 的示例。

    "use strict";
    var peoples = [{name: "Person1"},{name: "Person2"}];
    for(let person in people){
        let name = person.name;
        setTimeout(function(){ console.log(name) }, 1000);
    }
    

    但是,您必须使用可选的 --harmony 标志来运行节点。
    使用“严格”模式是because

    或者您可以简单地使用Array.prototype.map()Array.prototype.forEach()

    【讨论】:

    • 您的意思是通过在 for 循环中简单地更改 let 而不是 var 来改进随机生成?
    • 编码时,您可以将var fakeName, fakeEmail .... 替换为let。 JS 在循环语句中没有本地范围,不像 java 这样的语言。
    • 您能否编辑您的问题,详细说明有关获得 ES6 支持、"use strict" 的需要以及使用--harmony 运行节点的详细信息
    猜你喜欢
    • 2011-07-18
    • 1970-01-01
    • 2013-02-06
    • 2017-06-12
    • 2014-07-10
    • 2013-05-01
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多