Hellom's Studio.

Express + mongodb基础

字数统计: 1.4k阅读时长: 6 min
2020/03/29 Share

MongoDB 安装

mongodb 官网 选择自己的操作系统下载

下载完成解压后重命名为 mongodb

配置环境变量

export PATH=/usr/local/mongodb/bin:$PATH

在 mongodb 根目录下新建数据库存储目录 /data/db

然后启动 mongod

启动成功后 再打开一个终端输入 mongo 即可启动服务

MongoDB 连接

安装 mongoose

npm i mongoose
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
// index.js
const express = require('express');

const app = express();

// 引用 mongoose 包
const mongoose = require('mongoose');

/*
数据库连接
'mongodb://localhost:27017/express-test' ==> 数据库地址
mongodb:// ==> 固定的格式,必须得指定
localhost: ==> 本地ip地址
27017 ==> mongodb默认端口号
/express-test ==> 创建的数据库名称
*/
mongoose.connect('mongodb://localhost:27017/express-test', { useNewUrlParser: true, useUnifiedTopology: true })

// 创建一个模型
const Product = mongoose.model('Product', new mongoose.Schema({
title: String
}))

// 模型中插入数据
Product.insertMany([
{ title: '测试产品1' },
{ title: '测试产品2' },
])


app.get('/product', async (req, res) => {
res.send(await Product.find()) // 发送从MongoDB查出来的数据
})

MongoDB 查询

  • Product.find(): 查询所有的数据

  • Product.find().limit(2): 限制条数 只返回2条数据

  • Product.find().skip(1).limit(2): 跳过第一条数据,返回后面两条数据 (用于做分页)

  • Product.find().where({ title: '产品1' }): 添加条件参数来 查询数据

  • Product.find().sort({ _id: 1 }): 排序 1是正序 -1是倒序

1
2
3
4
5
6
7
8
9
10
11
12
13
// 查询列表数据
app.get('/product', async (req, res) => {
const data = await Product.find();
res.send(data);
}

// 查询列表详情页数据
app.get('/product/:id', async (req, res) => {
// 通过客户端传 id 参数来查询
// 再通过 Product.findById()方法 查询到详情页数据
const data = await Product.findById(req.params.id);
res.send(data)
})

MongoDB 新增产品和POST请求

新增产品

1
2
3
4
5
6
7
8
app.post('/product', async (req, res) => {
// 获取客户端传来的数据
const data = req.body;

// 使用 Product.create() 存到数据库中
const product = await Product.create(data);
res.send(product);
})

POST请求

首先在 vscode 安装 REST Client插件

REST Client: 用来测试接口数据的工具 类似于 Postman

在项目根目录中新建 test.http 文件

###: 代表结束符

点击 Send Request 即可在 vscode 右侧窗口看到执行的结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 设置公共变量 uri
@uri=http://localhost:3000/

Send Request
GET {{uri}}product

###

Send Request
POST {{uri}}product
Content-Type: application/json

{
"title": "产品1"
}

###
1
2
3
4
5
6
7
8
9
/* 
发送 POST 请求后执行的结果
即在数据库创建一条数据
*/
{
"_id": "5e80bdb9f42f1f90b2f60941",
"title": "产品1",
"__v": 0
}

MongoDB 修改产品 和 PUT请求

1
2
3
4
5
6
7
8
9
10
11
12
// 修改产品
app.put('/product/:id', async (req, res) => {
// 查找到需要修改的产品
const product = await Product.findById(req.params.id);

// 把客户端发过来的值赋值
product.title = req.body.title;

// 保存到数据库中
await product.save()
res.send(product);
})

那么如何测试接口呢

还是使用之前的 REST Client 插件

修改请求方式为 PUT

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
// 测试 修改产品接口

PUT {{uri}}product/5e80a84e1ac6f88cf68f268d

Content-Type: application/json

// 模拟客户端传来的修改后的值
{
"title": "产品666"
}

// 输出如下内容:
HTTP/1.1 200 OK
X-Powered-By: Express
Access-Control-Allow-Origin: *
Content-Type: application/json; charset=utf-8
Content-Length: 62
ETag: W/"3e-71mz7eph3NU5pIezQ9R97V5S0ww"
Date: Mon, 30 Mar 2020 14:25:37 GMT
Connection: close

{
"_id": "5e80a84e1ac6f88cf68f268d",
"title": "产品666",
"__v": 0
}

MongoDB 删除产品 和 DELETE 请求

删除产品

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 删除产品
app.delete('/product/:id', async (req, res) => {
// 第一种删除方法
const product = await Product.findById(req.params.id);
await product.delete();

// 第二种删除方法
const product = await Product.findById(req.params.id);
await product.remove();

// 第三种删除方法
await Product.deleteOne({ _id: req.params.id })

// 返回删除成功的提示
res.send({
success: true
})
})

DELETE 请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 测试删除接口
DELETE {{uri}}product/5e80bd55485cfa9080fa4585

// 输出如下内容:
HTTP/1.1 200 OK
X-Powered-By: Express
Access-Control-Allow-Origin: *
Content-Type: application/json; charset=utf-8
Content-Length: 16
ETag: W/"10-oV4hJxRVSENxc/wX8+mA4/Pe4tA"
Date: Mon, 30 Mar 2020 15:04:36 GMT
Connection: close

{
"success": true
}

实例完整代码

静态文件 index.html

1
2
3
4
5
6
7
8
9
<!-- index.html -->
<body>
<h1>express 访问静态文件</h1>
<script>
fetch('http://localhost:3000/product').then(res => res.json()).then(res =>{
console.log(res);
})
</script>
</body>

接口文件 index.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
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// index.js
// 引入 express 模块
const express = require('express');

// 实例化 express
const app = express();

// 引入 跨域包
app.use(require('cors')());

// 访问静态文件
app.use(express.static('public'))

// 处理 json 数据
app.use(express.json())

// 引入 mongoose 模块
const mongoose = require('mongoose');

// 数据库连接
mongoose.connect('mongodb://localhost:27017/express-test', { useNewUrlParser: true, useUnifiedTopology: true })

// 创建一个模型
const Product = mongoose.model('Product', new mongoose.Schema({
title: String
}))

// 获取 About 数据
app.get('/about', (req, res) => {
res.send({ 'page': 'about' })
})

// 获取产品列表
app.get('/product', async (req, res) => {
res.send(await Product.find())
})

// 获取产品详情页
app.get('/product/:id', async (req, res) => {
const data = await Product.findById(req.params.id);
res.send(data)
})

// 新增产品
app.post('/product', async (req, res) => {
const data = req.body;
const product = await Product.create(data);
res.send(product);
})

// 修改产品
app.put('/product/:id', async (req, res) => {
const product = await Product.findById(req.params.id);
product.title = req.body.title;
await product.save()
res.send(product);
})

// 删除产品
app.delete('/product/:id', async (req, res) => {
await Product.deleteOne({ _id: req.params.id })
res.send({
success: true
})
})

// 监听端口
app.listen(3000, () => {
console.log('serve port is 3000!');
})

测试接口文件 test.http

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
// test.http

@uri=http://localhost:3000/

GET {{uri}}product

###

GET {{uri}}product/5e80a84e1ac6f88cf68f268d

###

POST {{uri}}product
Content-Type: application/json

{
"title": "产品1"
}

###

PUT {{uri}}product/5e80a84e1ac6f88cf68f268d
Content-Type: application/json

{
"title": "产品666"
}

###

DELETE {{uri}}product/5e80bd55485cfa9080fa4585
CATALOG
  1. 1. MongoDB 安装
  2. 2. MongoDB 连接
  3. 3. MongoDB 查询
  4. 4. MongoDB 新增产品和POST请求
    1. 4.1. 新增产品
    2. 4.2. POST请求
  5. 5. MongoDB 修改产品 和 PUT请求
  6. 6. MongoDB 删除产品 和 DELETE 请求
    1. 6.1. 删除产品
    2. 6.2. DELETE 请求
  7. 7. 实例完整代码