node.js+postman+mongodb搭建测试注册接口的实现

准备工作

申请一个免费的MongoDB

https://www.mlab.com注册申请一个500M的MongoDB数据库。登录后手动在创建Databases下的Collections中手动创建一个数据库node_app。

在个人首页点击Connect获取node.js连接MongoDB数据库的字符串为

1

mongodb+srv://<username>:<password>@cluster0.ylpaf.mongodb.net/node_app

将其中<username>:<password>修改为自己设定的数据库用户名和密码。

下载安装Postman

https://www.postman.com/注册一个账号,下载安装Postman agent,即可方便地进行GET/POST/PUT等测试。

mongodb连接串配置

安装mongoose用于连接数据库:

1

2

3

4

5

6

> npm install mongoose

> cd C:\Users\xiaoming\source\repos\node_demo\node_app

> mkdir config

> cd config

> new-item keys.js -type file

编辑keys.js配置连接串:

1

2

3

module.exports = {

    mongoURI: "mongodb+srv://<username>:<password>@cluster0.ylpaf.mongodb.net/node_app"

}

编辑server.js入口文件:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

const express = require("express");

const mongoose = require("mongoose");

const app = express();

const db = require("./config/keys").mongoURI;

mongoose.connect(db)

        .then(() => console.log("MongoDB connected."))

        .catch(err => console.log(err));

app.get("/", (req, res) => {

    res.send("Hello World!");

})

const port = process.env.PORT || 5000;

app.listen(port, () => {

    console.log(`Server running on port ${port}`);

})

检查是否能连接到数据库:

1

2

3

4

5

6

7

8

9

> nodemon server.js

[nodemon] 2.0.16

[nodemon] to restart at any time, enter `rs`

[nodemon] watching path(s): *.*

[nodemon] watching extensions: js,mjs,json

[nodemon] starting `node server.js`

Server running on port 5000

MongoDB connected.

数据库连接正常。

GET请求测试

创建路由文件

1

C:\Users\xiaoming\source\repos\node_demo\node_app\routes\api\users.js

编辑users.js并添加GET请求:

1

2

3

4

5

6

7

8

9

// login & registtration

const express = require("express");

const router = express.Router();

router.get("/test", (req,res) => {

    res.json({msg:"Login succeeded!"})

})

module.exports = router;

编辑server.js,导入并使用users.js:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

const express = require("express");

const mongoose = require("mongoose");

const app = express();

const users = require("./routes/api/users"); 

const db = require("./config/keys").mongoURI;

mongoose.connect(db)

    .then(() => console.log("MongoDB connected."))

    .catch(err => console.log(err));

// 设置app路由

app.get("/", (req, res) => {

    res.send("Hello World!");

})

// 使用users

app.use("/api/users", users);

const port = process.env.PORT || 5000;

app.listen(port, () => {

    console.log(`Server running on port ${port}`);

})

访问

1

http://localhost:5000/api/users/test

可以看到

1

{"msg":"Login succeeded!"}

注册接口搭建

创建User数据模型

创建用户数据模型文件

1

C:\Users\xiaoming\source\repos\node_demo\node_app\models\User.js

编辑User.js创建用户数据模型:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

const mongoose = require("mongoose");

const Schema = mongoose.Schema;

// create Schema

const UserSchema = new Schema({

    name:{

        type: String,

        required: true

    },

    email: {

        type: String,

        required: true

    },

    password: {

        type: String,

        required: true

    },

    avatar: {

        type: String

    },

    date: {

        type: Date,

        default: Date.now

    },

})

module.exports = User = mongoose.model("users", UserSchema);

使用body-parser中间件

安装body-parser中间件,可以方便地处理HTTP请求。

1

> npm install body-parser

编辑server.js使用body-parser:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

const express = require("express");

const mongoose = require("mongoose");

const bodyParser = require("body-parser");

const app = express();

const users = require("./routes/api/users"); 

const db = require("./config/keys").mongoURI;

app.use(bodyParser.urlencoded({ extended: false }));

app.use(bodyParser.json());

mongoose.connect(db)

    .then(() => console.log("MongoDB connected."))

    .catch(err => console.log(err));

app.get("/", (req, res) => {

    res.send("Hello World!");

})

app.use("/api/users", users);

const port = process.env.PORT || 5000;

app.listen(port, () => {

    console.log(`Server running on port ${port}`);

})

POST请求测试

编辑users.js增加POST请求:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

// @login & registtration

const express = require("express");

const router = express.Router();

/*

 * $route GET /api/users/test

 * @desc return requested json data

 * @access public

 */

router.get("/test", (req,res) => {

    res.json({msg:"Login succeeded!"})

})

/*

 * $route POST /api/users/register

 * @desc return requested json data

 * @access public

 */

router.post("/register", (req, res) => {

    console.log(req.body);

})

module.exports = router;

POST中暂时只有一个打印请求体的操作。

在Postman中的Workspace中测试:

1

POST http://localhost:5000/api/users/register

Body选择x-www-form-urlencoded,在KEY和VALUE中填入测试内容:

1

2

KEY         VALUE

email    harlie@google.com

查看终端输出:

Server running on port 5000
MongoDB connected.
[Object: null prototype] { email: 'harlie@google.com' }

说明成功获取到了req.body。

使用User数据模型

首先安装bcrypt包。bcrypt可以用来加密注册用户的密码,避免在数据库中存储明文密码。在https://www.npmjs.com/上可以查看bcrypt包的用法介绍。

1

> npm install bcrypt

编辑users.js引入并使用User数据模型:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

// @login & registtration

const express = require("express");

const router = express.Router();

const bcrypt = require("bcrypt");

const User = require("../../models/User.js");

/*

 * $route GET /api/users/test

 * @desc return requested json data

 * @access public

 */

router.get("/test", (req,res) => {

    res.json({msg:"Login succeeded!"})

})

/*

 * $route POST /api/users/register

 * @desc return requested json data

 * @access public

 */

router.post("/register", (req, res) => {

    //console.log(req.body);

    // check if email already exists

    User.findOne({ email: req.body.email })

        .then((user) => {

            if (user) {

                return res.status(400).json({ email: "邮箱已被注册!" })

            } else {

                const newUser = new User({

                    name: req.body.name,

                    email: req.body.email,

                    password: req.body.password

                })

                // encrypt newUser password

                bcrypt.genSalt(10, function (err, salt) {

                    bcrypt.hash(newUser.password, salt, (err, hash) => {

                        if (err) throw err;

                        newUser.password = hash;

                        newUser.save()

                            .then(user => res.json(user))

                            .catch(err => console.log(err));

                    });

                });

            }

        })

})

module.exports = router;

在Postman中的Workspace中测试POST http://localhost:5000/api/users/register。Body选择x-www-form-urlencoded,在KEY和VALUE中填入测试内容:

1

2

3

email     godfrey@eldenring.com

name      godfrey

password  123456

查看测试输出

1

2

3

4

5

6

7

8

{

    "name": "godfrey",

    "email": "godfrey@eldenring.com",

    "password": "$2b$10$hoGzFeIdZyCwEotsYhxEheoGNOCE4QnYYh/WkKoGkuPT0xZI9H10C",

    "_id": "62a4482c00990937d819ea6d",

    "date": "2022-06-11T07:45:48.437Z",

    "__v": 0

}

打开mongodb,在DATABASES下的node_app中查看,会发现多出了一个users的Collection,其中刚好存储了上面我们刚通过POST请求插入的一条数据。

使用gravatar处理头像

在gravatar - npm中查看gravatar的使用方法。

安装gravatar

1

> npm i gravatar

编辑users.js增加注册头像(avatar)处理:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

// @login & registtration

const express = require("express");

const router = express.Router();

const bcrypt = require("bcrypt");

const gravatar = require("gravatar");

const User = require("../../models/User.js");

/*

 * $route GET /api/users/test

 * @desc return requested json data

 * @access public

 */

router.get("/test", (req,res) => {

    res.json({msg:"Login succeeded!"})

})

/*

 * $route POST /api/users/register

 * @desc return requested json data

 * @access public

 */

router.post("/register", (req, res) => {

    //console.log(req.body);

    // check if email already exists

    User.findOne({ email: req.body.email })

        .then((user) => {

            if (user) {

                return res.status(400).json({ email: "Email already registered!" })

            } else {

                const avatar = gravatar.url(req.body.email, { s: '200', r: 'pg', d: 'mm' });

                const newUser = new User({

                    name: req.body.name,

                    email: req.body.email,

                    avatar,

                    password: req.body.password

                })

                // encrypt newUser password

                bcrypt.genSalt(10, function (err, salt) {

                    bcrypt.hash(newUser.password, salt, (err, hash) => {

                        if (err) throw err;

                        newUser.password = hash;

                        newUser.save()

                            .then(user => res.json(user))

                            .catch(err => console.log(err));

                    });

                });

            }

        })

})

module.exports = router;

在Postman中的Workspace中测试POST http://localhost:5000/api/users/register,Body选择x-www-form-urlencoded。

在KEY和VALUE中填入测试内容:

1

2

3

email     godfrey@eldenring.com

name      godfrey

password  123456

测试会返回报错

1

2

3

{

    "email": "Email already registered!"

}

在KEY和VALUE中填入测试内容:

1

2

3

email      mohg@eldenring.com

name       mohg

password   123456

测试返回

1

2

3

4

5

6

7

8

9

{

    "name": "mohg",

    "email": "mohg@eldenring.com",

    "password": "$2b$10$uSV2tmA5jH6veLTz1Lt5g.iD5QKtbJFXwGsJilDMxIqw7dZefpDz.",

    "avatar": "//www.gravatar.com/avatar/c5515cb5392d5e8a91b6e34a11120ff1?s=200&r=pg&d=mm",

    "_id": "62a44f12d2c5293f0b8e9c2b",

    "date": "2022-06-11T08:15:14.410Z",

    "__v": 0

}

​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/277887.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch的 8.x常用api汇总

ES的查询语法比较复杂,对于初学者需要在不断练习中才会逐渐掌握,本文汇总了ES各种查询语法以及常用api,可以作为新手的实用笔记 首先,安装 Kibana! 下载Elasticsearch,官方下载页面;Elasticsearch 参考,官方文档;<

读书笔记-《数据结构与算法》-摘要6[快速排序]

快速排序 核心&#xff1a;快排是一种采用分治思想的排序算法&#xff0c;大致分为三个步骤。 定基准——首先随机选择一个元素最为基准划分区——所有比基准小的元素置于基准左侧&#xff0c;比基准大的元素置于右侧递归调用——递归地调用此切分过程 快排的实现与『归并排…

STP笔记总结

STP --- 生成树协议 STP&#xff08;Spanning Tree Protocol&#xff0c;生成树协议&#xff09;是根据 IEEE802.1D标准建立的&#xff0c;用于在局域网中消除数据链路层环路的协议。运行STP协议的设备通过彼此交互信息发现网络中的环路&#xff0c;并有选择地对某些端口进行阻…

C++ 指针基础

指针的定义 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h>int main() {int a 10;printf("%p\n", &a); // &a 表示取&#xff08;a&#xff09;的地址 000000842FD9FB64// 存放指针&#xff08;地址&#xff09;的变量就是指针变量&#xff0c…

力扣第一题-两数之和[简单]

题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任…

UE4 图片环形轮播 蓝图

【需求】 图片环形轮播 任意图片之间相互切换 切换图片所需时间均为1s 两个图片之间切换使用就近原则 播放丝滑无闪跳 【Actor的组成】 每个图片的轴心都在原点 【蓝图节点】

内网穿透的应用-如何在群辉7.2中使用Docker安装并远程访问本地网心云容器魔方管理界面

文章目录 1. 拉取容器魔方镜像2. 运行容器魔方3. 本地访问容器魔方4. 群辉安装Cpolar5. 配置容器魔方远程地址6. 远程访问测试7. 固定公网地址 本文主要介绍如何在群辉7.2版本中使用Docker安装容器魔方&#xff0c;并结合Cpolar内网穿透工具实现远程访问本地网心云容器魔方界面…

CMS—评论功能设计

一、需求分析 1.1、常见行为 1.敏感词过滤 2.新增评论&#xff08;作品下、评论下&#xff09; 3.删除评论&#xff08;作品作者、上级评论者、本级作者&#xff09; 4.上级评论删除关联下级评论 5.逻辑状态变更&#xff08;上线、下线、废弃...&#xff09; 6.上逻辑状态变更…

如何在jenkins容器中安装python+httprunner+pytest+git+allure(一)

背景&#xff1a; API接口自动化使用python语言实现&#xff0c;利用httprunner框架编写自动化用例场景&#xff08;执行的时候还是依赖pytest),使用jenkins自动构建git上的源代码&#xff0c;并产生allure报告可视化展示API执行结果。 步骤 1.进入jenkins容器 注意使用roo…

FAQ:Inheritance 篇——What your mother never told you

文章目录 1、How can I set up my class so it won’t be inherited from&#xff1f;&#xff08;如何设置类&#xff0c;使它不会被继承?&#xff09;2、How can I set up my member function so it won’t be overridden in a derived class? &#xff08;如何设置成员函数…

遇到运维故障,有没有排查和解决故障的正确流程?

稳定是偶然&#xff0c;异常才是常态&#xff0c;用来标注IT运维工作再适合不过。 因为对于IT运维来说&#xff0c;工作最常遇到的就是不稳定性带来的各种故障&#xff0c;经常围绕发现故障、响应故障、定位故障、恢复故障这四大步。 故障处理是最心跳的事情&#xff0c;没有…

十五、YARN辅助架构

1、学习内容 &#xff08;1&#xff09;了解什么是代理服务器 &#xff08;2&#xff09;了解什么是历史服务器 2、辅助架构 &#xff08;1&#xff09;辅助架构的由来 对于YARN架构来讲&#xff0c;除了ResourceManager集群资源总管家、NodeManager单机资源管家两个核心角…