数据准备
1、打开Navicat for MySQL,在locahost目录下面新建数据库【myblog】
2、在数据库【myblog】下面简单建表【blogs】和【users】,
3、与数据库mysql建立连接
独立建立文件夹db(建立链接)和conf(配置项)
db项目,建立mysql.js,专门用来连接数据库,统一调用,这样就不用每条查询/新增等都建立新的链接
conf目录,新建db.js,专门用来做一些连接数据库的配置信息
db.js
const env = process.env.NODE_ENV // 环境参数
// 配置
let MYSQL_CONF
if (env === 'dev') {
// mysql
MYSQL_CONF = {
host: 'localhost',
user: 'root',
password: '123456',
port: '3306',
database: 'myblog'
}
}
if (env === 'production') {
// mysql
MYSQL_CONF = {
host: 'localhost',
user: 'root',
password: '123456',
port: '3306',
database: 'myblog'
}
}
module.exports = {
MYSQL_CONF
}
mysql.js
const mysql = require('mysql')
const { MYSQL_CONF } = require('../conf/db')
// 创建链接对象
const con = mysql.createConnection(MYSQL_CONF)
// 开始链接
con.connect()
// 统一执行 sql 的函数
function exec(sql) {
const promise = new Promise((resolve, reject) => {
con.query(sql, (err, result) => {
if (err) {
reject(err)
return
}
resolve(result)
})
})
return promise
}
module.exports = {
exec,
escape: mysql.escape // 防止sql注入 编码特殊字符
}
4、路由
接下来简单的写一个查询列表的的路由,查询表blogs的数据
在routes文件夹中加入blog.js
const router = require('koa-router')()
const {
getList
} = require('../controller/blog')
router.prefix('/api/blog')
router.get('/list', async function (ctx, next) {
let author = ctx.query.author || ''
const keyword = ctx.query.keyword || ''
const listData = await getList(author, keyword)
ctx.body = listData
})
module.exports = router
新建控制层controller文件夹(这个文件夹专门来写SQL语句)和控制层controller文件夹下blog.js
const { exec } = require('../db/mysql')
const getList = async (author, keyword) => {
let sql = `select * from blogs where 1=1 `
if (author) {
sql += `and author='${author}' `
}
if (keyword) {
sql += `and title like '%${keyword}%' `
}
sql += `order by createtime desc;`
return await exec(sql)
}
module.exports = {
getList
}
然后app.js中在路由的部分分别加入
...
// 加入blog路由
const blog = require('./routes/blog')
...
app.use(blog.routes(), blog.allowedMethods())
...
接下来就可以用路由访问了,我们来试试:
跑完上面的,基本可以和前端对接了,我们知道在和前端对接的数据中,基本上要有一个标识code来确认接口是否成功和相关的描述message描述,接下来我们建一个统一回调的模型:
5、新建统一接口响应模型
新建文件夹model,里面再新建 resModel.js 文件:
class BaseModel {
constructor(data, message) {
if (typeof data === 'string') {
this.message = data
data = null
message = null
}
if (data) {
this.data = data
}
if (message) {
this.message = message
}
}
}
// 成功
class SuccessModel extends BaseModel {
constructor(data, message) {
super(data, message)
this.code = 0
}
}
// 错误
class ErrorModel extends BaseModel {
constructor(data, message) {
super(data, message)
this.code = -1
}
}
// 自定义code,方便特殊情况下返回特殊code,不能和上面已建的code重复
class CustomModel extends BaseModel {
constructor(code, data, message) {
super(data, message)
this.code = code
}
}
module.exports = {
SuccessModel,
ErrorModel,
CustomModel
}
我们来改一下上面的/routes/blog.js文件:
const router = require('koa-router')()
const {
getList
} = require('../controller/blog')
const { SuccessModel, ErrorModel } = require('../model/resModel') // 加入
router.prefix('/api/blog')
router.get('/list', async function (ctx, next) {
let author = ctx.query.author || ''
const keyword = ctx.query.keyword || ''
const listData = await getList(author, keyword)
// ctx.body = listData
ctx.body = new SuccessModel(listData, '成功') // 修改
})
module.exports = router
再重新请求一下接口
这样子就可以设置统一的回调格式,愉快的和前端对接了~~~~~~~~