Зачем фейкеру дублировать данные?

Я использую 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)];, всегда дают один и тот же результат, как я могу его улучшить?


person diegoaguilar    schedule 24.06.2015    source источник


Ответы (1)


В JavaScript оператор var i like в цикле for был объявлен как глобальная переменная, а 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.
Использование «строгого» режима потому что.

ИЛИ Вы можете просто использовать Array.prototype.map() или Array.prototype.forEach()

person greenlikeorange    schedule 24.06.2015
comment
Вы имеете в виду, что простое изменение let вместо var в цикле for улучшит генерацию случайных чисел? - person diegoaguilar; 24.06.2015
comment
При написании кода вы можете заменить var fakeName, fakeEmail .... на let. JS не имеет локальной области видимости в операторе цикла, в отличие от java подобного языка. - person greenlikeorange; 24.06.2015
comment
Можете ли вы отредактировать свой вопрос, рассказав подробности о получении поддержки ES6, необходимости "use strict" и запуске узла с --harmony - person diegoaguilar; 24.06.2015