如何在Node.js中使用Faker.js生成虚假数据
在系统开发和测试中,使用假数据是非常有用的。这是因为它可以防止人们使用自己的真实身份,特别是在识别号码、全名和出生日期等数据方面。手动生成假数据需要时间,因此减缓了测试过程,因为很难想出大量的新数据。
在本教程中,我们将学习如何使用Faker模块在Node.js中生成假数据。然后我们将在网页中以表格的形式输出假数据。我们将在我们的计算机上本地运行我们的进程,但从一个在线服务器上获取信息。
主要收获
在本教程结束时,你将知道以下内容。
- Faker.js的主要组件。
- 如何创建一个简单的网页结构。
- 如何生成假数据。
- 将假数据存储在一个表中。
- 将生成的假数据链接到网页上。
前提条件
本课程的基本要求包括。
- 网络开发的基本知识。
- Node.js基础知识。
- 在机器上安装一个基本的IDE。我们最好使用Visual Studio Code。
- 一个稳定的互联网连接。
- 在你的电脑上安装了MongoDB。
什么是Faker.js
Faker.js是一个Node.js库,它允许用户生成大量的假数据供其项目使用。它可以在本地运行程序时生成,也可以通过在网络浏览器中部署网页的方式远程生成。它通过从一个在线服务器中随机选择每次执行时要求的一些变量来进行生成。
它可以产生大量的数据,从而使开发人员在测试过程中把他们的程序推到极限。然后,开发者可以像在现实生活中那样分析数据,并做出理想的决定。
Faker.js可以生成什么类型的数据?
可以生成的一些数据例子包括但不限于以下几类。
- 地址
- 动物
- 公司
- 商业
- 日期
- 数据类型
- 图片
- 名称
- 时间和更多...
你可以选择一个子类别,首先要求 "faker",调用主类别,然后在一个句号后添加子类别。一个例子是console.log('faker.animal.dog');
现在我们知道了这一切,让我们深入了解一下教程。
设置项目的整体结构
首先,创建主目录并将其命名为 "Fakedata"。这将是我们程序的基础目录。在Visual Studio Code中打开该目录。
在Visual Studio Code中打开集成终端,运行npm init -y ,快速创建一个 "package.json "文件。
在主目录中创建一个名为 "app.js "的文件。这将是程序的起点。
一旦完成,让我们在主目录下创建两个新的文件夹,即 "views "和 "models"。在 "views "目录下,创建 "home.ejs "文件。在 "models "文件夹内创建另一个文件,并将其命名为 "user.js"。
文件夹结构
文件夹结构将如下图所示。
Fakedata (根目录)
node_modules (文件夹)
models (文件夹)
user.js (文件)
views (文件夹)
home.ejs (文件)
app.js (文件)
现在我们已经完成了上述任务,让我们进入代码和一些解释。
设置我们的环境
让我们依次进行以下工作。
安装软件包
本教程所需的Node.js库包括。
- nodemon
- Express
- ejs
- mongoose
- faker
在集成终端中,运行以下命令,一次性安装上述软件包。
npm i nodemon express ejs mongoose faker
安装可能需要一些时间,这取决于你的网络速度。请耐心等待,直到过程停止。
你可以选择运行一个额外的命令,npm update 来更新已安装的软件包。
配置package.json
现在打开 "package.json "文件,配置它,以便你可以使用nodemon启动应用程序。在脚本下,添加 "dev "和 "start "的配置。
代码看起来应该如下。
{
"name": "fakedata",
"version": "1.0.0",
"description": "",
"main": "app.js",
"scripts": {
"start": "node app.js",
"dev": "nodemon app.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"ejs": "^2.7.4",
"express": "^4.17.1",
"faker": "^4.1.0",
"mongoose": "^5.12.5",
"nodemon": "^2.0.7"
}
}
完成后,现在让我们写代码来构建和运行一个测试应用程序。
测试Faker.js模块
首先,让我们给控制台中的faker.js库做个测试。在 "app.js "文件中写入以下代码。由于使用了for循环,这些将回馈20次随机数据。你可以在控制面板中看到生成的数据。
var faker = require("faker");
// Initializing our variables with a different random data each time it is run
var randomName = faker.name.findName(); // Generates a random name
var randomEmail = faker.internet.email(); // Generates a random email
var randomProduct = faker.commerce.productName(); // Generates a random product name
var randomCompany = faker.company.companyName(); // Will give back a random company name
var randomCard = faker.helpers.createCard(); // It's output is a random contact card containing many properties
// Iteration
// This code runs twenty times
// It produces each time different data
for (i = 0; i < 20; i++) {
console.log(randomName); // Outputs a random name
console.log(randomEmail); // Outputs a random email
console.log(randomProduct); // Outputs the random product name generated
console.log(randomCompany); // Produces a random company name
console.log(randomCard); // Gives back a random card
console.log(faker.date.past()); // Generates a random past date
}
在终端使用命令node index.js ,运行 "app.js "文件。
如果出现 "脚本被禁用 "的错误,比如下面显示的错误,请按照这些简单的步骤来删除它们。
- 打开一个新的PowerShell终端,以管理员身份运行。
- 键入
get-executionpolicy,检查当前状态。 - 如果它返回为 "受限",运行
set-executionpolicy remotesigned。 - 在命令行对话中输入 "A",以快速接受所有的变化,然后按回车键。
现在,我们已经看到我们的测试成功运行,我们可以进入主程序了。
该项目将如何运行
代码在执行时将使用faker.js库来多次生成所需的数据。它将把生成的每个值存储在一个本地数据库中。然后我们将在网络浏览器中看到来自数据库的结果,作为一个网页。
设置应用程序的起点
"app.js "将被用作我们应用程序的起点。
app.js
在这个文件中,一步一步地做以下工作。
- 要求我们刚刚安装的软件包,如下图所示。
// Require needed packages
var express = require("express");
var mongoose = require("mongoose");
var faker = require("faker");
var path = require("path");
var fakerModel = require("./models/user");
- 连接到Mongodb数据库里面一个名为 "fakedata "的新数据库。
如下图所示。
// Connect to a local Mongodb database called fakedata
// If successful log out on the console "connected to db"
// else "connection error"
mongoose
.connect("mongodb://localhost:27017/fakedata", { useNewUrlParser: true })
.then(() => console.log("connected to db"))
.catch((error) => console.log("connection error", error));
- 使用express将我们的模板引擎(视图引擎)设置为 "ejs",并设置我们的绝对目录路径到源目录。
如下图所示。
// Use express to set up our view engine to "ejs"
// Set up our absolute directory path to the source directory
var app = express();
app.set("view engine", "ejs");
app.set("views", path.resolve(__dirname, "views"));
- 设置我们的简单路由系统,以便在应用程序启动或产生新数据时将我们带到主网页。我们还将保存我们产生的所有数据,并存储在我们数据库内的变量中。
// Set up our simple routing system to take us to the "home.ejs" file
// or the home webpage whenever the application is launched
app.get("/", (req, res) => {
fakerModel.find((err, data) => {
if (err) {
console.log(err);
} else if (data) {
res.render("home", { data: data });
} else {
res.render("home", { data: {} });
}
});
});
// Return each data generated to the variables below and save all of them
// This will be done ten times due to the for loop
// You can add the number of data to be generated by changing the value
app.post("/", (req, res) => {
for (var i = 0; i < 10; i++) {
var fakee = new fakerModel({
firstname: faker.name.firstName(),
lastname: faker.name.lastName(),
phonenumber: faker.phone.phoneNumber(),
city: faker.address.city(),
state: faker.address.state(),
country: faker.address.country(),
});
fakee.save((err, data) => {
if (err) {
console.log(err);
}
});
}
res.redirect("/");
});
- 配置要使用的端口。
// Set up our ports in which we shall see the webpage and data generated
// We will use 5000 as our port number
var port = process.env.PORT || 5000;
app.listen(port, () => console.log("server running at port " + port));
正如你所看到的,我们已经添加了一个for循环,这个循环将重复十次。这又会在每次运行时增加十行新的数据。你可以通过改变数值来增加或减少要生成的数据的数量。
设置模型
user.js
在 "models "文件夹内,导航到 "user.js "文件。
在该文件中做以下工作。
- 创建一个新的数据库并命名为 "fakedata",插入这些列:firstname, lastname, phonenumber, city, state, and country。
它们的数据类型如下面的代码所示。
// Require the mongoose model
var mongoose = require("mongoose");
// Add the following columns in it and their datatypes
var fakerSchema = new mongoose.Schema({
firstname: String,
lastname: String,
phonenumber: String,
city: String,
state: String,
country: String,
});
// Require it as the output
module.exports = mongoose.model("fakerCollection", fakerSchema);
设置视图
home.ejs
在这个文件中,我们将创建一个网页结构来显示数据。它将有一个按钮,当按下时,将生成新的数据,并在显示时自动保存。
我们还将添加一个表格,它的列数将与生成的列数相同。然后我们将使用bootstrap和谷歌字体添加一些快速格式化。
- 设置整体的页面结构和一个要使用的标题。
<!DOCTYPE html>
<html lang="en">
<head>
<title>Fake Data Generator</title>
<!-- Required meta tags -->
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1, shrink-to-fit=no"
/>
<!-- Bootstrap CSS -->
<link
rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T"
crossorigin="anonymous"
/>
<!-- Custom CSS -->
<style>
@import url("https://fonts.googleapis.com/css2?family=Montserrat:wght@500&display=swap");
* {
font-family: Montserrat;
}
.card {
margin: 0 auto;
/* Added */
float: none;
/* Added */
margin-bottom: 10px;
/* Added */
}
</style>
</head>
<body>
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script
src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
crossorigin="anonymous"
></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"
integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1"
crossorigin="anonymous"
></script>
<script
src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"
integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM"
crossorigin="anonymous"
></script>
<!-- Main Container -->
<div class="container">
<!-- Header -->
<br />
<h1 class="text-center">FAKE DATA GENERATOR</h1>
<hr />
<p class="text-secondary">This is a simple Fake Data generator website</p>
<hr />
<!-- Header end.//-->
</div>
<!--container end.//-->
</body>
</html>
- 在 "container "div元素标签内添加一个生成数据的按钮,如下面的代码所示。
<!-- Generate button -->
<form action="/" method="post">
<input
type="submit"
class="btn btn-primary btn-lg btn-block"
value="click to generate the data"
/>
</form>
<br />
<!-- Generate button end.//-->
<a class="btn btn-primary stretched-link" href="#footer">Go to the bottom</a>
<hr />
正如你所看到的,它将在点击时触发这个过程。额外的链接将使我们能够使用页面内的HTML链接,在点击按钮时快速从页面的顶部导航到底部,我们将在后面看到。
- 添加一个表格,在提到要使用的变量时使用 "ejs "模板引擎格式。这将被放置在按钮下面的 "容器 "div中。
见下面的代码。
<!-- Table -->
<%if(data.length>0){%>
<table
class="table table-striped table-inverse table-responsive"
border="1"
style="text-align: center;"
>
<thead class="thead-inverse">
<tr>
<th>s.no</th>
<th>firstname</th>
<th>lastname</th>
<th>phonenumber</th>
<th>city</th>
<th>state</th>
<th>country</th>
</tr>
</thead>
<tbody>
<%for(var i=0;i< data.length; i++){%>
<tr>
<td><%= i%></td>
<td><%= data[i].firstname%></td>
<td><%= data[i].lastname%></td>
<td><%= data[i].phonenumber%></td>
<td><%= data[i].city%></td>
<td><%= data[i].state%></td>
<td><%= data[i].country%></td>
</tr>
<%}%>
</tbody>
</table>
<%}%>
<!-- Table end.//-->
- 只是为了方便有大量数据的人,我们将在页面的末尾添加另一个 "生成 "按钮。现在我们将添加另一个链接,其id为 "footer"。我们已经设置了最初的 "转到底部 "链接,通过其id指向它。
所有这些我们都将放在页脚元素里面,如下图所示。
<!-- Footer section-->
<hr />
<p class="text-secondary">This is the end of the page!</p>
<hr />
<p class="text-secondary">Click the button below to generate more data...</p>
<!-- Generate button-->
<form action="/" method="post">
<input
type="submit"
class="btn btn-primary btn-lg btn-block"
value="click to generate the data"
/>
</form>
<br />
<!-- Generate button end.//-->
<footer id="footer">Bye...</footer>
<!-- Footer section end.//-->
运行项目
在运行代码之前,确保MongoDB在后台运行。
在你的集成终端中,运行以下命令。
nodemon run dev
如果它输出一个运行信息或 "连接到db",就像我们在代码中早先设置的那样,打开一个web浏览器。在网页浏览器中,输入localhost:5000 ,然后按回车键。
一旦显示出该页面,点击 "点击生成数据 "按钮。
结果将如下图所示。
你可以在安装在你电脑上的MongoDB中查看生成的数据。只要打开 "MongoDB Compass "并连接到默认的localhost,也就是localhost:27017 。你会看到一个名为 "fakedata "的新数据库。一旦你打开它,你会看到一个名为 "fakercollection "的集合。
所有在会话中产生的数据都会在那里找到。
恭喜你!你已经使用Node.js为你的需求生成了假数据。
结论
虚假数据对于系统测试非常重要。人们可以使用Node.js模块获得所需的数据,并将其存储在本地,以便立即或将来使用。人们可以根据基本的目的,选择各种他/她的需要。
我们已经简单地了解了假数据的重要性,什么是faker.js,如何在一个简单的node项目中整合它,如何运行、查看和存储生成的结果。
进一步的项目
- 你可以通过将生成的数据或存储的数据直接注入到你想测试的系统中,从而进一步推进你的项目。
- 你也可以决定对生成的数据进行密集的AI驱动的分析,以了解更多关于生成的数据的模式。