路由开发
我们在前面已经熟悉了koa2的中间件,路由等。也学会了怎么去使用redis存session。下面我们就开发完整的功能吧,我们将会复用之前的一些代码,如: mysql,redis配置、密码加密逻辑,controller、登录中间件等。下面开始吧
安装mysql、xss
yarn add mysql xss -S
这里注意,因为koa2的中间件采用的async/await
的形式,所以我们需要对controller坐一下调整,如下
const getDetail =async id => {
let sql = `select * from blogs where id='${id}'`
const rows = await exec(sql)
return rows[0]
}
const newBlog =async (blogData = {}) => {
//blogData是一个博客对象,包含title content, author 等属性
const title = xss(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}');
`
const insertData = await exec(sql)
return {
id: insertData.insertId
}
}
对登录验证中间件做如下修改
const { ErrorModel } = require('../model/resModel')
module.exports = async (ctx, next) => {
if(ctx.session.username) {
await next()
return
}
ctx.body = new ErrorModel('未登录')
}
有了上面的基础知识,我们就可以实现我们正式的路由了,如下
router.get('/list', async function (ctx, next) {
let author = ctx.query.author || ''
const keyword = ctx.query.keyword || ''
if (ctx.query.isadmin) {
if (ctx.session.username == null) {
ctx.body = new ErrorModel('未登录')
return
}
// 强制查询自己的博客
author = ctx.session.username
}
const listData = await getList(author, keyword)
ctx.body = new SuccessModel(listData)
})
router.get('/detail', async (ctx, nect) => {
const data = await getDetail(ctx.query.id)
ctx.body=new SuccessModel(data)
})
这里需要注意几点
- koa2的中间件的形式是
async/await
形式(再次强调) - koa2中把req和res都整合到ctx中处理
其他接口大家可以自己完成,这里就不带着大家写了
日志
- access log 使用morgan
之前可能注意到,我们入口文件中有“koa-logger”的中间件的使用,但这并不能实现日志的文件写入,唯一的作用就是让我们控制台打印的东西更好看,所以要实现真正的日志处理还得需要morgan
来实现
,而morgan仅是在express
中有效,所以我们需要安装一个兼容插件
yarn add koa-morgan -S
然后就可以像在express中使用一样了
const path = require('path');
const fs = require('fs')
const morgan = require('koa-morgan')
const ENV = process.env.NODE_ENV
if (ENV !== 'production') {
app.use(morgan('dev'));
} else {
const logFileName = path.join(__dirname, 'logs', 'access.log')
const writeStream = fs.createWriteStream(logFileName, {
flags: 'a'
})
app.use(morgan('combined', {
stream: writeStream
}));
}
下面配置不同的环境参数试试吧
网友评论