美文网首页
跟我一起学koa2之路由开发、日志处理

跟我一起学koa2之路由开发、日志处理

作者: 喜剧之王爱创作 | 来源:发表于2020-05-14 21:18 被阅读0次

路由开发

我们在前面已经熟悉了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
  }));
}

下面配置不同的环境参数试试吧

相关文章

网友评论

      本文标题:跟我一起学koa2之路由开发、日志处理

      本文链接:https://www.haomeiwen.com/subject/jxzxohtx.html