这是我参与更文挑战的第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
的, 技术上可能没有很大的突破,但对我来讲确实是一个值得纪念的时刻~