- 有代码基础
- 安装node、mySql、最好再加个postman,方便接口调试,下载方式此处省略
- 创建数据库,并且添加数据库表和记录,以下不多赘述,数据库最终所需数据附图,下图中usermsg表可忽略
一、安装好node+mySql之后,在创建的目录文件夹下打开命令窗口,执行
npm init,会自动生成一个package.json文件,然后再执行,:
npm install express
npm install body-parser
npm install cors --save
二、在node文件夹下新建一个文件app.js(即入口文件),同时为了后续的代码更轻便整洁,最好是在搭建项目时最好就考虑好模块化,新建四个文件夹Model、Router、Controller、Until。
入口文件app.js代码如下,注释都在代码段里
const express = require('express');
const app = express();
const cors = require('cors');
const bodyParser = require('body-parser'); //解析参数用的
const userRouter = require('./Router/userRouter');
app.use(cors()); // 解决跨域
app.use(bodyParser.json()) // json请求
app.use(bodyParser.urlencoded({ extended: false })) // 表单请求
app.all('*',(req,res,next) => {
// 设置允许跨域的域名,*代表允许任意域名跨域
res.header('Access-Control-Allow-Origin','*')
// 允许的header类型
res.header('Access-Control-Allow-Headers','content-type');
// 跨域允许的请求方式
res.header('Access-Control-Allow-Methods','DELETE,PUT,POST,GET,OPTIONS')
// 在请求的回调函数汇中遇见next(),就会继续执行后面的代码
next()
})
app.use('/user',userRouter)
app.listen(80, () =>{
console.log('80端口启动!')
})
Model文件夹下新建文件userMedel.js,主要是处理数据库的操作命令和方法调用
const {db} = require('../Util/mySql');
// 通过用户名查询对应数据
exports.getUname = (res,username) =>{
let sql = 'SELECT * FROM user WHERE username = ?'
let data = db(sql, res, [username])
return data;
}
controller文件夹下新建文件userContrller.js,处理请求数据库后的数据回调
const userModel = require('../Model/userModel');
const { Result } = require('../Util/mySql')
exports.handleLogin = async (req, res) => {
let { username, password } = req.query;
let $data = await userModel.getUname(res, username);
// 判断用户名不能为空
if (!username) {
return res.send(new Result({ msg: '用户名不能为空' }))
}
// 判断用户是否存在
if ($data.length === 0) {
return res.send(new Result({ msg: '用户名不存在' }))
}
// 判断密码是否正确
if (password != $data[0].password) {
return res.send(new Result({ msg: '密码错误' }))
}
// 登录成功
return res.send(new Result({ msg: '登录成功',data:$data }))
}
Router文件夹下新建文件userRouter.js,用来配置接口路由
const express = require('express');
const userRouter = express.Router();
// 导入 userController
const userController = require('../Controller/userController');
// 登录
userRouter.get('/login', userController.handleLogin)
module.exports = userRouter;
Until文件夹下新建文件mySql.js,创建数据库连接池并连接,此处也可以使用mysql.createConnection方法来创建,但是考虑到建立一个数据库连接所消耗的性能成本是很高的,在服务器应用程序中,如果为每一个接收到的客户端都建立一个或多个数据库连接,将严重的降低应用程序性能,所以一步到位,直接使用连接池mysql.createPool。
const mysql = require('mysql');
// 以下信息是你的数据库信息
const option = {
host: '127.0.0.1',
user: 'root',
password: 'Aa123456',
port: '3306',
database: 'new_datadbase',
connectTimeout: 5000, // 连接超时
multipleStatements: true // 支持执行多条 sql 语句
}
let pool;
repool();
function repool() { // 断线重连机制,每隔3s重连一次
pool = mysql.createPool({ // 创建连接池
...option,
waitForConnections: true, // 当无连接池可用时,等待(true)还是报错(false)
connectionLimit: 100, // 连接数限制
queueLimit: 0 // 最大连接等待数(0为不限制)
})
pool.on('error', err => err.code === 'PROTOCOL_CONNECTION_LOST' && setTimeout(repool, 3000))
}
let db = function (sql, res, params = []) {
return new Promise((resolve, reject) => {
// 一、创建一个连接池,也就是上面的pool
// repool();
// 二、连接
pool.getConnection((err, connection) => {
// 三、使用sql语句操作
connection.query(sql, params, (err, results) => {
if (err) {
// res是调用接口时,如果执行mysql执行出错,直接返回报错信息
let $errData = {
code: 500,
msg: `服务器内部错误${err.message}`,
data: null
}
return res.json(new Result($errData));
} else {
// return res.json(new Result({ data: results }))
resolve(results)
}
// 释放连接池
connection.release();
})
})
})
}
function Result({ code = 200, msg = '成功', data = null }) {
this.code = code;
this.msg = msg;
this.data = data;
}
module.exports = { db, Result }
三、启动接口,node app.js, 接口启动成功,但由于node在更改代码后需要每次重启才会刷新,可以下载个可自动刷新的配置,我这里用得是hotnode,下载命令npm install hotnode,下载后更改package.json里的start为hotnode app.js,然后在命令行内运行即可,启动后可以通过http://localhost:80/user/login?username=admin&password=123456 去访问接口,也可以在postman中调试
最终接口返回:
ok,到此一个简单的接口就实现了-。-