Koa2-创建、中间件、连接数据库、处理请求、日志

本文介绍了如何安装配置Koa2,使用nodemon实现项目热更新。详细讲解了process对象,中间件的概念及洋葱模型,展示了路由中间件的设置。同时,文章还涉及了数据库连接(mysql),处理跨域问题的cors中间件,以及使用log4js进行日志等级划分。
摘要由CSDN通过智能技术生成


在这里插入图片描述

安装配置koa2

Koa2本身的功能是很少的,主要都是借助各种中间件来搞定
👻安装 koa2

npm i koa2 -s

👻在package.json 配置,当然是在npm init的基础之上

"scripts": {
    "start": "node index.js"
    ...
  },

👻这样就可以 借用 npm run start 来启动

配置nodemon,热更新我们的项目

nodemon详解

npm i nodemon -s

👻在package.json中配置 scripts/start 改为

"scripts": {
    "start": "nodemon index.js"
    ...
  },

process

process 是什么

process对象是一个全局变量,提供了有关当前的Node.js进程并对其进行控制,作为一个全局变量
进程是计算机系统进行资源分配合调度的基本单位,是线程的容器
每个进行都拥有自己独立的空间地址,数据栈,另外一个进行无法访问当前进程的变量、数据结构、只有数据通信后进程之间才可以数据共享

相关方法

后续更新

中间件

什么是中间件

中间件的本质为一个回调函数,参数包含请求对象、响应对象和执行下一个中间件的函数
koa中间件采用的是洋葱模型、每次执行下一个中间件传入两个参数
ctx: 封装了request和response 的变量
next: 进入下一个要执行的中间件函数

👻洋葱模型

在这里插入图片描述
👻下面的示例代码可以说明这种情况

app.use(async (ctx,next) => {
    console.log(1)
    await next()
    console.log(1)
})
app.use(async (ctx,next) => {
    console.log(2)
    await next()
    console.log(2)
})
app.use(async (ctx,next) => {
    console.log(3)
    await next()
    console.log(3)
})

👻结果如下
在这里插入图片描述

路由中间件

npm i koa-router	-s

👻我们直接给koa-router -s 做迁移(单独的文件夹存放),并对该模块进行切片
新建 Router/index.js

const Router = require('koa-router')
const router =  new Router()
const user = require('./user')
router.use('/user',user.routes(),user.allowedMethods())
// 重定向
router.redirect('/','/user')
module.exports = router

👻新建 Router/user.js

const Router = require("koa-router")
const user = new Router()
user.get('/add',(ctx)=>{
    ctx.body = "添加用户"
})

module.exports = user

👻原本的入口文件 index.js

const koa = require('koa2')
const router = require('./Router')
const { port } = require('./setting')
// 声明一个实例
const app = new koa()

/**
 * router.routers()作用是启动路由
 * router.allowedMethods()允许所有请求方法111
 */
app.use(router.routes(),router.allowedMethods())
app.listen(port, () => {
    console.log("localhost:"+`${port}`)
})

👻以上就完成了路由模块的基本内容

连接数据库 - mysql

👻首先准备好数据库
👻新建连接数据库的代码

const mysql = require('mysql')

const connection = mysql.createConnection({
    host     : 'localhost',
    user     : 'root',
    password : 'xxx',
    database : 'property'
});

connection.connect()

connection.query('select * from user',function(err,results,fileds){
    if(err)throw err
    console.log(results)
})
connection.end()

👻在这里mysql的版本过新的话会出现
Client does not support authentication protocol requested by server; consider upgrading MySQL cli
这是由于mysql版本过高,8版本的用户密码加密规则与以往的不同,可以参考下面的进行更改,加密规则
解决办法

👻我们可以选择连接池进行连接,并进行封装

const mysql = require('mysql')
// 连接池
const pool = mysql.createPool({
    connectionLimit: 10,
    host: 'localhost',
    user: 'root',
    password: 'root',
    database: 'property'
});

/**
 * 查询操作数据库函数
 * @param sql sql语句
 * @param callback 回调函数
 */
function query(sql, callback) {
    pool.getConnection((err, connection) => {
        if (err) throw err
        connection.query(sql, (err, rows) => {
            callback(err, rows)
            connection.release()
        })
    })
}

module.exports = query

const db = require('../utils/db')
db('select * from user',(err,rows)=>{
    if(err)throw err
    console.log(rows)
})

👻详细内容
mysql包官方文档

后端允许跨域

npm i koa2-cors

👻这个中间件一定要写在路由之前

app.use(cors());
app.use(router.routers(),router.allowMethods());

处理请求

我们暂时都是靠postman模拟发送请求

get

post

处理post请求,需要借助koa-body中间件,koa-body支持解析json,也支持文件解析
在这里安装一下

npm  i  koa-body

index.js 入口文件

const {koaBody} = require('koa-body')
app.use(koaBody());

put

delete

日志

一定要看这个参考文章
官方文档
在此基础之上,我写一点补充
这里需要借助log4js中间件,直接下载就可以了

npm install log4js

等级划分

选定等级之后,只能等于大于该等级,all 是允许全部

logger.trace('this is trace');
logger.debug('this is debug');
logger.info('this is info');
logger.warn('this is warn');
logger.error('this is error');、
logger.fatal('this is fatal');
logger.mark('this is mark');

可以参考本代码

exports.logger = (name, level) => {
    const logger = log4js.getLogger(name)
    // 默认为debug权限及以上
    logger.level = levels[level] || levels['debug']
    return logger
}

其他的还是看上面那两个文章就可以了,配置信息都是很详细的

还有我做了更详细的注释

// 这里为封装的中间件
const log4js = require('log4js')
const Path = require('path')
// 等级
levels = {
    'trace': log4js.levels.TRACE,
    'debug': log4js.levels.DEBUG,
    'info': log4js.levels.INFO,
    'warn': log4js.levels.WARN,
    'error': log4js.levels.ERROR,
    'fatal': log4js.levels.FATAL,
}
// 文件名称,后面会拼接上日期
const dirName = 'info.log'
// 文件路径,位置
const _path = Path.resolve(__dirname, `../logs/${dirName}`)

log4js.configure({
    // 输出到控制台的内容,同时也输出到日志文件中
    replaceConsole: true,
    appenders: {
        cheese: {
            // 设置类型为 dateFile
            type: 'dateFile',
            // 配置文件名
            filename: _path,
            // 指定编码格式为 utf-8
            encoding: 'utf-8',
            // 配置 layout,此处使用自定义模式 pattern
            // layout: 'basic',
            // 日志文件按日期(天)切割
            pattern: "yyyy-MM-dd",
            // 回滚旧的日志文件时,保证以 .log 结尾 (只有在 alwaysIncludePattern 为 false 生效)
            keepFileExt: true,
            // 输出的日志文件名是都始终包含 pattern 日期结尾
            alwaysIncludePattern: true,
        },
    },
    // 不同类别,不做细分的话,默认就可以了
    categories: {
        // 设置默认的 categories
        default: {appenders: ['cheese'], level: 'debug'},
    }
})
/**
 * 导出配置好的logger函数
 * @param name 名称
 * @param level 等级
 * @returns {Logger}
 */
exports.logger = (name, level) => {
    //getLogger 此函数采用单个可选字符串参数来表示要用于此记录器上的日志事件的类别
    const logger = log4js.getLogger(name||"debug")
    // 默认为debug权限及以上
    logger.level = levels[level] || levels['debug']
    return logger
}

exports.use = (app, level, name) => {
    //加载中间件
    app.use(log4js.connectLogger(log4js.getLogger(name || 'logInfo'), {
        level: levels[level] || levels['all'],
        //格式化http相关信息
        format: ':method :url :status'
    }));
}

后续会继续更新

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刮刮乐打工仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值