为什么faker会产生重复数据?
Why would faker produce duplicate data?
我正在使用 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)];
的整个 faker 方法总是产生相同的结果,我该如何改进它?
在JavaScript中,for
循环中的var i
like语句声明为全局变量,request[method]
不是块代码。
这意味着它会继续变化,除非循环内没有块代码。
在循环内声明局部变量的一种方法是使用let
(ES6 特性)。
在 none 块代码的循环中使用 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 标志来节点。
使用 "strict" 模式是 because。
或者您可以简单地使用 Array.prototype.map()
或 Array.prototype.forEach()
我正在使用 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)];
的整个 faker 方法总是产生相同的结果,我该如何改进它?
在JavaScript中,for
循环中的var i
like语句声明为全局变量,request[method]
不是块代码。
这意味着它会继续变化,除非循环内没有块代码。
在循环内声明局部变量的一种方法是使用let
(ES6 特性)。
在 none 块代码的循环中使用 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 标志来节点。
使用 "strict" 模式是 because。
或者您可以简单地使用 Array.prototype.map()
或 Array.prototype.forEach()