创建项目
创建空文件夹
在终端执行
1
npm init
安装包
1 | npm i mysql; |
入口文件
在根目录创建入口文件
.js
,文件名可随意,通常使用 app、main、index 等。代码如下:app.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18const express = require('express');
const cors = require('cors');
const bodyParser = require('body-parser');
const app = express();
app.use(cors({
origin: ['http://localhost:8080']
}))
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({
extended: false,
type: "application/x-www-form-urlencoded",
}))
app.use(require('./router/user'));
app.listen(3001, () => {
console.log('服务器请求成功:http://localhost:3001');
})代码注释
- 6~8 行:配置跨域。
- 14 行:这里引入的
/router/user.js
文件见下文。
目录结构
/router:控制器目录。通常情况下每张数据表对应一个
.js
文件,文件内编写各个表要实现的接口。/utils:工具类目录。
数据库工具类: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
27const mysql = require('mysql');
// 数据库配置
const db = mysql.createPool({
host: '127.0.0.1',
user: 'root',
password: '123456',
database: 'test',
})
// error 对象
const errObj = { code: 400, msg: '服务异常' };
/**
* SQL 映射器
* @param {String} sql SQL 语句
* @param {String / Number / Array / Object} options 参数
*/
const sql = (sql, options) => new Promise((t,f) => {
db.query(sql, options, (err, res) => {
if (err) f(errObj);
else {
if (sql[0] == 's') t(res.length > 1 ? res : res[0] || null);
else t(res.affectedRows > 0 ? t(true) : f(errObj));
}
})
})
module.exports = { db, sql }注:21~22 行进行 sql 判断,若 sql 是查询语句,返回查询结果;否则根据执行 sql 后影响的行数
affectedRows
返回结果。全局工具类:tool.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
33const md5 = require('md5');
/**
* 检查请求参数
* @param {Object} e 参数对象
* @param {Object} dict 参数字典
*/
const inspect = (e, dict) => {
let res = { code: 200, msg: 'ok' };
let keys = Object.keys(dict);
for(let index in keys) {
let key = keys[index];
if (!e[key]) {
res.code = 500 + Number(index);
res.msg = `${dict[key]}不能为空`;
break;
}
}
return res;
}
/**
* MD5 加密
* @param {*} value 需要加密的值
*/
const getMD5 = (value) => {
return md5(value).toUpperCase();
}
module.exports = {
inspect, // 检查请求参数
getMD5, // MD5 加密
}注:此文件非必要,根据个人习惯编写,小编喜欢把一些公共的方法封装到本类中。
开发接口
下面是测试项目代码,代码质量一般,仅供参考,开发项目时根据实际业务编码。
/router/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
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99const express = require('express')
const router = express.Router()
const db = require('../utils/db')
const tool = require('../utils/tool')
// 登录
router.post('/user/login', (req, res) => {
const { body } = req;
const { account, password } = body;
let data = tool.inspect(body, { account: '账号', password: '密码' });
if (data.code == 200) {
db.sql('select * from admin where account = ?', account).then(e => {
if (e) {
if (e.password != tool.getMD5(password)) data = { code: 503, msg: '密码错误' };
else {
delete e.password;
data.data = e;
}
} else data = { code: 502, msg: '用户不存在' }
res.send(data);
}).catch(e => {
res.send(e)
});
} else res.send(data);
});
// 添加
router.post('/user/add', (req, res) => {
const { body } = req;
let data = tool.inspect(body, { account: '账号', username: '昵称' });
if (data.code == 200) {
body.password = tool.getMD5(body.account);
db.sql('select * from admin where account = ?', body.account).then(e => {
if (e) {
data = { code: 502, msg: '用户已存在' };
res.send(data);
} else {
db.sql('insert into admin set ?', body).then(e => {
if (e) res.send(data);
}).catch(e => {
res.send(e)
});
}
}).catch(e => {
res.send(e)
});
} else res.send(data);
})
// 修改
router.post('/user/edit', (req, res) => {
const { body } = req;
let data = tool.inspect(body, { id: 'ID', username: '昵称' });
if (data.code == 200) {
db.sql('select * from admin where id = ?', body.id).then(e => {
if (e) {
db.sql('update admin set ? where id = ?', [body, body.id]).then(e => {
if (e) res.send(data);
}).catch(e => {
res.send(e)
});
} else {
data = { code: 502, msg: '用户不存在' };
res.send(data);
}
}).catch(e => {
res.send(e)
});
} else res.send(data);
})
// 删除
router.post('/user/delete', (req, res) => {
const { body } = req;
let data = tool.inspect(body, { id: 'ID' });
if (data.code == 200) {
db.sql('select * from admin where id = ?', body.id).then(e => {
if (e) {
db.sql('delete from admin where id = ?', body.id).then(e => {
if (e) res.send(data);
}).catch(e => {
res.send(e)
});
} else {
data = { code: 502, msg: '用户不存在' };
res.send(data);
}
}).catch(e => {
res.send(e)
});
} else res.send(data);
})
module.exports = router