Node系列学习之MySQL(二)

748 阅读2分钟

这是我参与更文挑战的第11天,活动详情查看:更文挑战

封装SQL函数

配置文件

src 下新建 conf 文件夹,并在其下新建 db.js

src/conf/db.js

const env = process.env.NODE_ENV // 获取环境参数

let MYSQL_CONF

if (env == 'dev') {
  MYSQL_CONF = {
    host: 'localhost',
    user: 'root',
    password: '看不到看不到',
    port: '3306',
    database: 'myblog'
  }
}
if (env == 'production') {
  MYSQL_CONF = {
    host: 'localhost',
    user: 'root',
    password: '看不到看不到',
    port: '3306',
    database: 'myblog'
  }
}

module.exports = {
  MYSQL_CONF
}

OK, sql 的配置完成.

函数封装

src 下新建 db 文件夹, 并在其下新建 mysql.js

src/db/mysql.js

const mysql = require('mysql')
const { MYSQL_CONF } = require('../conf/db')
// 创建链接对象
const con = mysql.createConnection(MYSQL_CONF)

// 开始连接
con.connect()

// 同意执行 sql 的函数

function exec(sql) {
  return new Promise((resolve, reject) => {
    con.query(sql, (err, result) => {
      if (err) {
        reject(err)
        return
      }
      resolve(result)
    })
  })
}
module.exports = {
  exec
}

OK,简单的一个SQL执行函数封装完成~

路由优化

获取博客列表

controller/blog.js

...
const getList = (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;`
  // 返回的是个Promise
  return exec(sql)
  
}
...

router/blog.js

  // 获取博客列表
  if (method == 'GET' && req.path == '/api/blog/list') {
    const author = req.query.author || ''
    const keyword = req.query.keyword || ''
    // const listData = getList(author, keyword)
    // return new SuccessModel(listData)
    const result = getList(author,keyword)
    return result.then(listData => {
      return new SuccessModel(listData)
    })
  }

获取博客详情

controller/blog.js

...
// 博客详情
const getDetail = id => {
  const sql = `select * from blogs where id='${id}' `
  return exec(sql).then(rows => {
    return rows[0]
  })
}
...

router/blog.js

  // 获取博客详情
  if (method == 'GET' && req.path == '/api/blog/detail') {
    // const data = getDetail(id)
    // return new SuccessModel(data)
    const result = getDetail(id)
    return result.then(data => {
      return new SuccessModel(data)
    })
  }

新建博客文章

controller/blog.js

...
// 新建博客
const newBlog = (blogData = {}) => {
  const title = blogData.title
  const content = blogData.content
  const author = blogData.author
  const createTime = Date.now()
  const sql = `
    insert into blogs (title,content,createtime,author) values ('${title}','${content}',${createTime}, '${author}');
  `
  return exec(sql).then(insertData => {
    // console.log('insertData',insertData);
    return {
      id: insertData.insertId
    }
  })
}
...

router/blog.js

  // 新建一篇博客
  if (method == 'POST' && req.path == '/api/blog/new') {
    // const data = newBlog(req.body)
    // return new SuccessModel(data)
    req.body.author = 'tmier' // 待开发登录完成后再改成真实数据
    const result = newBlog(req.body)
    return result.then(data => {
      return new SuccessModel(data)
    })
  }

上面改完之后,相应的app.js 也需要修改一下

app.js

const querystring = require('querystring')
const handleBlogRouter = require('./src/router/blog.js')
const handleUserRouter = require('./src/router/user.js')

// 用于处理 postData
const getPostData = req => {
  return new Promise((resolve, reject) => {
    if (req.method !== 'POST') {
      resolve({})
      return
    }
    // 非json数据类型,忽略并返回{}
    if (req.headers['content-type' !== 'application/json']) {
      resolve({})
      return
    }
    // 正确的
    let postData = ''
    req.on('data', chunk => {
      postData += chunk.toString()
    })
    req.on('end', () => {
      if (!postData) {
        resolve({})
        return
      }
      // 成功返回
      resolve(JSON.parse(postData))
    })
  })
}

const serverHandle = (req, res) => {
  res.setHeader('Content-Type', 'application/json')

  // 获取path
  const url = req.url
  req.path = url.split('?')[0]

  // 解析 query
  req.query = querystring.parse(url.split('?')[1])

  // 处理 postData
  getPostData(req).then(postData => {
    req.body = postData
    // 处理 blog 路由 旧

    // const blogData = handleBlogRouter(req, res)
    // if (blogData) {
    //   res.end(JSON.stringify(blogData))
    //   return
    // }

    // 处理 blog 路由 新
    const blogResult = handleBlogRouter(req, res)
    if (blogResult) {
      blogResult.then(blogData => {
        res.end(JSON.stringify(blogData))
      })
      return
    }

    // 处理 user 路由
    const userData = handleUserRouter(req, res)
    if (userData) {
      res.end(JSON.stringify(userData))
      return
    }
    // 未命中路由, 返回404
    res.writeHead(404, { 'Content-Type': 'text/plain' })
    res.write('404 Not Found\n')
    res.end()
  })
}
module.exports = serverHandle

​ OK,今天的文章就更新到这里了, 已经完成了从数据库获取数据,现在接口请求的的数据已经是从数据库里拿到的, 而不是自己在js文件里mock的, 技术上可能没有很大的突破,但对我来讲确实是一个值得纪念的时刻~