目标:
基于nodejs 用express + mysql 包 写接口,实现学生数据添加。
接口1
添加学生数据
url: localhost:3000/api/student
method: post
参数格式:普通键值对
name: 字符串
age: 数值
测试:postman来测试
接口2
获取所有的学生数据
url: localhost:3000/api/student
method: get
参数:无
测试:postman来测试
实现步骤
1. 新建一个项目文件夹,进行项目初始化
终端窗口输入命令: npm init --yes
初始化完成会在项目文件夹下生成会生成package.json文件
2. 下载安装express 和 mysql
终端窗口输入命令: npm i express mysql
安装完成,会在项目文件夹下生成node_modules文件夹和package-lock.json文件,如下所示
3. 创建utills文件夹,并在其下面创建sql.js文件用来模块化mysql,项目结构如下:
4. 操作sql.js,模块化mysql
4.1 使用加载mysql
4.2 创建连接mysql对象
4.3 连接到MySQL服务器
4.4 导出mysql
具体操作如图所示:
5. 打开phpstdudy软件,开启MySQL,连接数据库
6. 在项目根目录中创建server.js文件操作数据库
6.1 导入express并调用
6.2 导入sql模块
6.3 设置接收参数格式为普通键值对格式
6.4 设置post路由接口,操作数据库,向数据库中添加人员信息
具体操作如下:
//-----------测试端口代码,连接服务器代码-------------
//-----------封装的msq代码,在上面---------------
// 引入模块express,mysql
const experss = require('express')
const mysql = require('mysql')
// -------------将mysql的前三步自定义模板化,放在tools文件夹下--------
const connection = require('./tools/msq')
const app = experss()
// 接收简单的键值对
app.use(experss.urlencoded())
// 书写post请求
app.post('/api', (req, res) => {
// 解构赋值,将接收到的数据赋值
// 接收到的数据储存在req.body中
const { name, age } = req.body
// 书写sql语句,定义sql
// 模板化字符串,使用${}接收变量
// 因为传入的变量没有加引号,所以变量之前增加引号
const sql = `insert into student (name ,age) values('${name}','${age}')`
// console.log('连接的sql', sql) 打印拼接后的sql语句
// mysql模块的第四步,第一个参数为sql语句,第二个参数为回调函数(回调函数的参数)
// 回调参数:第一个为err错误,第二个data为对数据库操作的一个对象集合
connection.query(sql, (err, data) => {
// 如果错误,返回添加失败
if (err) {
res.send({ hint: '添加失败', state: 1 })
} else {
// 成功则返回 成功的信息
res.send({
// data.insertId为数据库的索引Id值
hint: '添加成功,添加的id为: ' + `${data.insertId}`,
state: 0,
data: data,
})
}
})
})
app.listen(8000, () => {
console.log('服务器启动了,8000')
})
6.5 获取所有人员信息的路由接口
app.get('/api', (req, res) => {
const sql = `select id,name,age from student`
connection.query(sql, (err, data) => {
if (err) {
res.send({ hint: '获取失败', state: 1 })
} else {
res.send({ hint: '获取成功', state: 0, data: data })
}
})
})
6.6 启动服务器
7. 打开postman测试接口,并检查数据库是否更新
7.1 测试接口
7.2 测试结果
7.3 数据库已更新
7.4 路由中间件
7.5拆分
// 导入模块
const experss = require('express')
// 导入数据库
const connection = require('../tools/msq')
// 路由方法
const router = experss.Router()
const fs = require('fs')
// 接收简单键值对
router.use(experss.urlencoded())
function getClientIp(req) {
return (
req.headers['x-forwarded-for'] ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress
)
}
router.use('/api', (req, res, next) => {
let obj = {
time: new Date().toLocaleString(), //访问时间
url: req.url, // 访问地址
ip: getClientIp(req), // ip地址
}
let data = JSON.stringify(obj)
fs.appendFile('usename', data, (err, data) => {
if (err) {
console.log('追加错误', err)
return
}
})
// 输出日志
// console.log('现在是', new Date())
// console.log('访问的地址是', req.url)
// console.log('ip是', getClientIp(req))
next()
})
router.post('/api', (req, res) => {
// 解构赋值,将接收到的数据赋值
// 接收到的数据储存在req.body中
const { name, age } = req.body
// 书写sql语句,定义sql
// 模板化字符串,使用${}接收变量
// 因为传入的变量没有加引号,所以变量之前增加引号
const sql = `insert into student (name ,age) values('${name}','${age}')`
// console.log('连接的sql', sql) 打印拼接后的sql语句
// mysql模块的第四步,第一个参数为sql语句,第二个参数为回调函数(回调函数的参数)
// 回调参数:第一个为err错误,第二个data为对数据库操作的一个对象集合
connection.query(sql, (err, data) => {
// 如果错误,返回添加失败
if (err) {
res.send({ hint: '添加失败', state: 1 })
} else {
// 成功则返回 成功的信息
res.send({
// data.insertId为数据库的索引Id值
hint: '添加成功,添加的id为: ' + `${data.insertId}`,
state: 0,
data: data,
})
}
})
})
// gat接口 - 步骤同post基本一致 , 具体传入的sql语句不同
router.get('/api', (req, res) => {
const sql = `select id,name,age from student`
connection.query(sql, (err, data) => {
if (err) {
res.send({ hint: '获取失败', state: 1 })
} else {
res.send({ hint: '获取成功', state: 0, data: data })
}
})
})
module.exports = router
7.6 合并
// server.js express项目的主文件
const express = require('express')
const app = express()
// 导入
const apiRouter = require('./router/api.js')
app.use('/router', apiRouter)
app.listen(3000, () => {
console.log(3000)
})