简介

从零单排学会用nodejs搭建接口服务器,对mysql进行增删改查

准备工作

  1. 下载Postman和Navicat并安装

    提取码:9knh

    postman不需要注册

    navicat有个破解补丁,把简体中文64位里面的两个文件拷贝到安装目录下即可。每次打开点击试用(如下图)

    image

  2. 查看本地Nodejs版本(运行命令 node -v

    image

    只要保证Nodejs版本为8即可

用navicat连接阿里云数据库,并创建一个表

  1. 打开软件 -> 文件 -> 新建连接 -> Mysql(如下图)

    image

  2. 填写Mysql信息(如下图)

    image

    密码我单独给你

  3. 点击 测试连接,弹出 连接成功(如下图)

    image

  4. 点击 确定后,左侧出来一个阿里云的链接(如下图)

    image

  5. 双击 阿里云 , 左边有个 gzcs , 这个数据库就是我们要测试用的(如下图)

    image

  6. 点击 创建表 (如下图)

    image

  7. 输入名为 Id,长度 10不为null,单击 自动递增 (如下图)

    image

  8. 点击 添加字段,输入名为 name,字符集为 utf8 (如下图)

    image

  9. 点击保存,输入表名 test (如下图)

    image

  10. 左侧应该有 test 这个表了,双击(如下图)

    image

  11. 猛点最下面的 + , 咱创建几条数据(如下图)

    image

  12. 五条记录已经建好了,下面给这五条记录的 name 字段赋值,内容随便填,点击 (如下图)

    image

  13. 大功告成,现在数据库已经准备好了。

安装express,搭建接口服务器

  1. 安装express应用生成器
1
npm install express-generator -g
  1. 创建一个叫 gzcs 的应用
1
express gzcs

image

  1. 打开目录应该长这样

image

  1. 安装依赖

    1
    npm install

    image

  2. 运行应用

    1
    npm start

    image

  3. 打开浏览器访问 http://localhost:3000

image

express里面增加get、post请求

  1. 打开 routes/index.js

  2. 增加如下代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // 增加一个路径为a的GET路由,返回一个json
    router.get('/a', function (req, res, next) {
    res.send({
    success: 1,
    method: 'GET'
    });
    });
    // 增加一个路径为a的POST路由,返回一个json
    router.post('/a', function (req, res, next) {
    res.send({
    success: 1,
    method: 'POST'
    });
    });
  3. 整体的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
    var express = require('express');
    var router = express.Router();

    /* GET home page. */
    router.get('/', function (req, res, next) {
    res.render('index', {
    title: 'Express'
    });
    });
    // 增加一个路径为a的GET路由,返回一个json
    router.get('/a', function (req, res, next) {
    res.send({
    success: 1,
    method: 'GET'
    });
    });
    // 增加一个路径为a的POST路由,返回一个json
    router.post('/a', function (req, res, next) {
    res.send({
    success: 1,
    method: 'POST'
    });
    });

    module.exports = router;
  4. 重启服务

    1
    2
    按 ctrl + C
    npm start

用postman测试新增的接口

  1. 打开 postman, 输入 http://localhost:3000/a ,点击 send (如下图)

image

  1. 点击 + , 把方法改为 post, 点击 send (如下图)

image

可以看到,刚才我们在 index.js 的路由文件里面加的两个接口已经成功了,可以监听 /aget 请求和 /apost 请求。

提升幸福感的小插件-nodemon

目前我们每次更新代码,都需要关闭服务后再执行 npm start,这样太麻烦了,可以全局安装 nodemon,并用 nodemon 启动服务,这样每次更新代码后,服务就会自动重启,很方便。

  1. 全局安装 nodemon
1
npm install nodemon -g
  1. nodemon 启动服务
1
nodemon bin/www

image

用nodejs操纵mysql

  1. 安装mysql的npm包
1
npm install mysql --save

image

  1. 在项目根目录创建config文件夹,在config文件夹里创建db.js

image

  1. db.js里填入以下内容

密码我单独给你

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// gzcs就是我们的这次测试的数据库名
var mysql = require("mysql");
var pool = mysql.createPool({
host:"47.95.2.204",
user:"root",
password:"",
database:"gzcs"
});

function query(sql,callback){
pool.getConnection(function(err,connection){
connection.query(sql, function (err,rows) {
callback(err,rows);
connection.release();
});
});
}

exports.query = query;
  1. 在routes/index.js里查询test表里所有数据
    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
    var express = require('express');
    var router = express.Router();
    var db = require("../config/db");
    /* GET home page. */
    router.get('/', function (req, res, next) {
    res.render('index', {
    title: 'Express'
    });
    });
    // 增加一个路径为get的GET路由,返回一个json
    router.get('/get', function (req, res, next) {
    db.query('select * from test', function (err, rows) {
    if (err) {
    res.send({
    success: 0,
    message: '数据库报错,' + err
    });
    } else {
    res.send({
    success: 1,
    data: rows,
    message: '查询test表成功'
    })
    }
    })
    });

    module.exports = router;
  2. 在postman里测试咱们写的接口对不对

image

  1. 插入数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// insert
router.post('/insert', function (req, res, next) {
let name = req.body.name;
db.query(`insert into test (name) values ('${name}')`, function (err, rows) {
if (err) {
res.send({
success: 0,
message: '新增失败'
});
} else {
res.send({
success: 1,
message: '新增成功'
})
}
});
})

注:插入的数据字段有多个的时候这么写db.query(insert into test (name,age) values ('${name}', ${age}), function(err, rows){});

  1. 在postman里测试插入接口

image

注:因为id为自增,所以不需要传入

  1. 删除数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    // delete
    router.post('/delete', function (req, res, next) {
    let id = req.body.id;
    db.query(`delete from test where id=${id}`, function (err, rows) {
    if (err) {
    res.send({
    success: 0,
    message: '删除失败'
    });
    } else {
    res.send({
    success: 1,
    message: '删除成功'
    })
    }
    });
    })

    注 因为id是int类型 所以where id=${id}不需要加引号,如果想通过name来删除,需要这么写db.query(delete from test where name='${name}', function(err,row){});

  2. 在postman里测试删除接口

image

已经删除了第6条记录

  1. 修改数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    // update
    router.post('/update', function (req, res, next) {
    let id = req.body.id;
    let name = req.body.name;
    db.query(`update test set name='${name}' where id=${id}`, function (err, rows) {
    if (err) {
    res.send({
    success: 0,
    message: '修改失败'
    });
    console.log(err);
    } else {
    res.send({
    success: 1,
    message: '修改成功'
    })
    }
    });
    });

    注:更新一条记录多个字段的时候这么写db.query(update test set name='${name}',age=${age} where id=${id}, function(err, rows){});

  2. 在postman里测试修改接口

image

已经把第五条记录的 heihei 改成了 jiao

小结

目前你已经学会了最基本的增删改查,我把 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
71
72
73
74
75
76
77
78
79
var express = require('express');
var router = express.Router();
var db = require("../config/db");
/* GET home page. */
router.get('/', function (req, res, next) {
res.render('index', {
title: 'Express'
});
});
// select
router.get('/get', function (req, res, next) {
db.query('select * from test', function (err, rows) {
if (err) {
res.send({
success: 0,
message: '数据库报错,' + err
});
} else {
res.send({
success: 1,
data: rows,
message: '查询test表成功'
});
}
});
});
// insert
router.post('/insert', function (req, res, next) {
let name = req.body.name;
db.query(`insert into test (name) values ('${name}')`, function (err, rows) {
if (err) {
res.send({
success: 0,
message: '新增失败'
});
} else {
res.send({
success: 1,
message: '新增成功'
})
}
});
})
// delete
router.post('/delete', function (req, res, next) {
let id = req.body.id;
db.query(`delete from test where id=${id}`, function (err, rows) {
if (err) {
res.send({
success: 0,
message: '删除失败'
});
} else {
res.send({
success: 1,
message: '删除成功'
})
}
});
})
// update
router.post('/update', function (req, res, next) {
let id = req.body.id;
let name = req.body.name;
db.query(`update test set name='${name}' where id=${id}`, function (err, rows) {
if (err) {
res.send({
success: 0,
message: '修改失败'
});
} else {
res.send({
success: 1,
message: '修改成功'
})
}
});
});
module.exports = router;

高级用法

  1. 首先我们把表弄的复杂一点

打开navicat,右键点击 设计表 ,如下图

image

  1. 新增 age 字段,点击 添加字段 ,输入 age ,类型是 Int, 长度是 3(因为没有超过999岁的人),点击 保存 。如下图

image

  1. 刷新数据库,就能看到新增的列了,如下图

image

  1. 我们给随便添加点数据,然后点击 ,如下图

image

  1. 修改一下多条数据操纵的接口,打开 config/db.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
    var mysql = require("mysql");
    var pool = mysql.createPool({
    host: "47.95.2.204",
    user: "root",
    password: "", // 密码我单独给你
    database: "gzcs"
    });

    function query(sql, callback) {
    pool.getConnection(function (err, connection) {
    connection.query(sql, function (err, rows) {
    callback(err, rows);
    connection.release();
    });
    });
    }
    // 新增多条操作的接口
    function multipleQuery(sql, values, callback) {
    pool.getConnection(function (err, connection) {
    connection.query(sql, values, function (err, rows) {
    callback(err, rows);
    connection.release();
    });
    });
    }
    exports.query = query;
    exports.multipleQuery = multipleQuery;
  2. router/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
// insert multiple
router.post('/insertMultiple', function (req, res, next) {
// 请求带过来的数组
let reqArr = req.body.data;
// 我们组装后的数组
let insertArr = [];
// 组装数据
reqArr.forEach(function (item) {
insertArr.push([item.name, item.age]);
})
// insertArr长这样:[['33', 33], ['44', 44]] 对应下面的sql语句中的 (name,age)。换句话说 就是把 ? 替换成inserArr
db.multipleQuery(`insert into test (name,age) values ?`, [insertArr], function (err, rows) {
if (err) {
res.send({
success: 0,
message: '插入多条失败'
});
} else {
res.send({
success: 1,
message: '插入多条成功'
})
}
});
});
  1. 在postman里测试插入多条接口,需要改变传值类型噢,要传json。

image

image

注:因为 ageInt 类型,所以不需要加 引号

  1. 在navicat里查看数据库结果,可以看到有了33和44。如下图

image

  1. 删除刚才创建的 3344
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
// delete multiple
router.post('/deleteMultiple', function (req, res, next) {
// 请求带过来的数组
let reqArr = req.body.data;
// 我们组装后的数组
let deleteArr = [];
// 组装数据
reqArr.forEach(function (item) {
deleteArr.push([item.id]);
})
// deleteArr长这样:[18, 19] 对应下面的sql语句中的 (id)
db.multipleQuery(`delete from test where (id) in (?)`, [deleteArr], function (err, rows) {
if (err) {
console.log(err);
res.send({
success: 0,
message: '删除多条失败'
});
} else {
res.send({
success: 1,
message: '删除多条成功'
})
}
});
});
  1. 在postman里测试删除多条接口,可以看到33和44都没了。如下图

image

  1. 新增、修改多条记录请多次调用单条新增、修改接口

  2. 把数据按age排序(desc 降序, asc 升序)

    1
    db.query('select * from test order by age desc', function (err, rows) {});

image

  1. 分页