搜索文档
创建项目
创建空文件夹
在终端执行
shnpm init
安装包
sh
npm i mysql;
npm i express;
npm i body-parser;
npm i cors;
npm i md5;
npm install -g nodemon; # 热加载(全局安装一次即可)入口文件
在根目录创建入口文件
.js,文件名可随意,通常使用 app、main、index 等。代码如下:app.js
jsconst express = require('express'); const cors = require('cors'); const bp = require('body-parser'); const app = express(); app.use(cors({ origin: ['http://localhost:8080'] })) app.use(bp.urlencoded({ extended: true })); app.use(require('./router/user')); app.listen(3000, () => { console.log('服务器请求成功:http://localhost:3000'); })代码注释
- 6~8 行:配置跨域。
- 14 行:这里引入的
/router/user.js文件见下文。
目录结构
/router:控制器目录。通常情况下每张数据表对应一个
.js文件,文件内编写各个表要实现的接口。/utils:工具类目录。
数据库工具类:db.js
jsconst 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
jsconst 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
jsconst 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
