第二章:nodejs koa2 mysql redis 全栈开发--mySQL数据连接与查询

数据准备

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

再重新请求一下接口

这样子就可以设置统一的回调格式,愉快的和前端对接了~~~~~~~~

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值