Koa2学习笔记(一)

190 阅读3分钟

创建Koa

第一步Koa项目初始化

使用命令npm init -y 进行初始化生成package.json文件,用于记录项目依赖。

image.png

第二步安装Koa框架

使用命令npm install --save koanpm i koa进行安装

image.png

安装成功之后会有node_modules文件夹,里面有koa的一些依赖包。

image.png

第三步创建一个入口文件

创建一个自定义名js文件。

image.png

第四步编写基础代码

1.在入口文件index.js中导入koa包

 const Koa = require('koa')

2.实例化对象

  const app =new Koa()  

3.使用中间件use

app.use(async ctx =>{
  //body 返回内容
  ctx.body = "这是Koa"
})

4.设置端口号

app.listen(3000)

使用node 文件名运行,这里如果不是在根目录,而在其他目录下还要加上目录路径如:node src/文件名。注意运行成功没有提示,不报错就是运行成功。

image.png

浏览器输入:http://localhost:3000 页面显示这是Koa。

image.png

第五步自重启

原先代码:

  app.use(async ctx =>{
      //body 返回内容
      ctx.body = "这是Koa"
  })

修改之后:

  app.use(async ctx =>{
      //body 返回内容
      ctx.body = "这是Koa,请刷新"
  })

刷新页面之后,页面依旧显示这是Koa。要改变页面内容只能重新启动node 文件名。

使用nodemon解决这个问题,命令:npm i nodemon

image.png

安装好nodemon之后打开package.json

image.png

在scripts中加入配置:

  "scripts": {
        "start":"nodemon ./index.js",
        "test": "echo \"Error: no test specified\" && exit 1"
  }

image.png

使用命令:npm i dotenv 管理配置信息,将读取.env文件中的配置文件转为 process.env变量的值。

image.png

两个依赖包安装好之后,在项目根目录创建一个.env配置文件

image.png

.env中进行配置参数

 NODE_ENV = dev 
 SERVER_PORT = 3000
 

创建一个单独的配置文件config

image.png

config.js中代码

//通过dotenv这个工具将env里的配置加载环境变量中
const Dotenv = require('dotenv')
Dotenv.config()
module.exports = process.env

index.js中代码

const { SERVER_PORT } = require('./config/config')
app.listen(SERVER_PORT)

使用npm run start打开之后,刷新页面就会改变内容

image.png

关于next

代码:

const r1 = function async(ctx,next){
        console.log("这是r1")
}

const r2 = function async(ctx,next){
        console.log("这是r2")
}

const r3 = function async(ctx,next){
        console.log("这是r3")
}

app.use(r1)
app.use(r2)
app.use(r3)

打印的结果是:这是r1 image.png

代码:

const r1 = function async(ctx,next){
        console.log("这是r1")
        next()
}


const r2 = function async(ctx,next){
        console.log("这是r2")
}


const r3 = function async(ctx,next){
        console.log("这是r3")
}

app.use(r1)
app.use(r2)
app.use(r3)

输出结果:这是r1 这是r2
image.png

代码:

const r1 = function async(ctx,next){
        console.log("这是r1")
}

const r2 = function async(ctx,next){
        console.log("这是r2")
        next()
}

const r3 = function async(ctx,next){
        console.log("这是r3")
}

app.use(r1)
app.use(r2)
app.use(r3)

输出结果:这是r1

image.png

由此可以看出next作用是使得后面的中间件可以执行。出现next就把中间文交到下一个中间件处理,如果没有next,就认为本次请求终止

代码:

 const r1 = function async(ctx,next){
     console.log("这是1")
     next()
     console.log("1又回来了")
 }


const r2 = function async(ctx,next){
     console.log("这是2")
     next()    
}


const r3 = function async(ctx,next){
     console.log("这是3")
     next()
     console.log("3又回来了")
}

app.use(r1)
app.use(r2)
app.use(r3)

输出结果:这是1 这是2 这是3 3又回来了 1又回来了 image.png

next执行完之后会回调,执行next后面的内容。

app.use执行顺序

const r1 = function async(ctx,next){
    console.log(1)
    next()
 }


const r2 = function async(ctx,next){
    console.log(2)
    next()    
}


const r3 = function async(ctx,next){
    console.log(3)
    next()    
}

app.use(r3)
app.use(r1)
app.use(r2)


输出结果:3 1 2

image.png

由此看出先引用的中间件,最先执行

中间件使用

koa-router

用于根据不同接口返回不同数据。

使用命令:npm install -S koa-router

导入依赖包

const Koa = require('koa')
const Router = require('koa-router')

创建实例

 const app =new Koa() 
 const router =new Router()

使用:

//get方式请求路径,进行处理
router.get('/',ctx=>{
    ctx.body="world"
})

router.get('/api',ctx=>{
     ctx.body="API"
})

//中间件通过use注册到app中
//router.routes()将路由内所有方法添加进去  router.allowedMethods()拦截器
//app.use只能接受一个函数作为参数,所以需要router.routes()返回一个函数
app.use(router.routes()).use(router.allowedMethods)

运行效果: image.png

image.png

优化router

创建一个路由文件夹

image.png

创建一个功能模块js

image.png

功能模块代码块:

 const Router = require('koa-router')
 //{prefix:'/user'}统一的前缀 /user , /user/data ,/user/updata
 const router = new Router({prefix:'/user'})
 // /data , /updata
 router.get('/',(ctx,next)=>{
        ctx.body="user"
 })
 module.exports = router

index.js调用功能模块js

const koa = require('koa')
const Router = require('koa-router')
const { SERVER_PORT } = require('./config/config')
//调用user接口数据
const userRouter= require('./router/UserRouter')
const app =new koa()
//注册中间件
app.use(userRouter.routes())
app.listen(SERVER_PORT)

image.png

本文章用于学习记录,有错误地方请多指正,谢谢。