koa入门


Koa入门


Koa.js是一款微型Web框架,写一个hello world很简单,但web应用离不开session,视图模板,路由,文件上传,日志管理。这些 Koa 都不提供,需要自行去官方的 Middleware 寻找。然而,100个人可能找出100种搭配--引用自其他博主

一. koa起步

1 项目初始化

执行npm init -y 生成package.json

npm init -y

2 按照koa

执行 npm install koa安装

npm install koa

3 编写服务程序

  1. 导入koa包 const Koa = require('Koa')
  2. 实例化app对象 const app = new Koa()
  3. 启动服务 app.listen(端口号, ()=>{})
// 导入Koa包
const Koa = require('koa')
// 实例化app对象
const app = new Koa()
// 编写中间件
app.use((ctx)=> {
  // ctx: content http请求上下文
  ctx.body = 'hello koa'
})
// 启动服务
app.listen(3000, ()=> {
  console.log('server is running at http://127.0.0.1:3000')
})

二. 中间件

1 基本概念

1.1 什么事中间件

中间件,就是在请求和响应中间的处理函数
有时候,从请求到响应的业务比较复杂,或者有些业务要单独抽离出来,每次请求都要调用,减少代码量,这些单独抽离出来的一个个功能独立的函数,就是中间件
中间件就像流水线上的工人,每个人干不同的工作,A干完传递给B,B干完传递给C…

1.2 基本使用

next 交由下一个中间件
ctx.body 向客户端相应的数据

const Koa = require('koa')

const app = new Koa()

app.use((ctx, next)=>{
  console.log('我是中间件1')
  next()
})
app.use((ctx, next)=>{
  console.log('我是中间件2')
  next()
})
app.use((ctx, next)=>{
  console.log('我是中间件3')
  ctx.body = 'hello koa'
})

app.listen(3001, ()=> {
  console.log('server is running at http://127.0.0.1:3001')
})
1.3 链式调用

上面的代码还可以写成

const Koa = require('koa')

const app = new Koa()

app.use((ctx, next)=>{
  console.log('我是中间件1')
  next()
})
.use((ctx, next)=>{
  console.log('我是中间件2')
  next()
})
.use((ctx, next)=>{
  console.log('我是中间件3')
  ctx.body = 'hello koa'
})

app.listen(3001, ()=> {
  console.log('server is running at http://127.0.0.1:3001')
})

2 洋葱圈模型

图片引自其他博主
这里是引用

const Koa = require('koa')
const app = new Koa
app.use((ctx, next)=> {
  console.log(1)
  next()
  console.log(2)
})
app.use((ctx, next)=> {
  console.log(3)
  next()
  console.log(4)
})
app.use((ctx, next)=> {
  console.log(5)
  ctx.body = 'hello koa'
})
app.listen(3000, ()=> {
  console.log('server is running at http://127.0.0.1:3000')
})

上面代码的输入结果为 :1 3 5 4 2

原理:

  1. 执行第一个中间件,输出1,执行next(),执行下一个中间件
  2. 执行第二个中间件,输出3,执行next(),执行下一个中间件
  3. 执行第三个中间件,输出5,执行完ctx.body = 'hello koa',第三个中间件执行完毕
  4. 第三个中间件执行完毕,等同于,第二个中间件的next(),执行完毕,第二个中间件继续向下执行,输出4,此时,第二个中间件执行完毕。
  5. 第二个中间件执行完毕,等同于,第一个中间件next(),执行完毕,第一个中间件件继续向下执行,输出2,此时所有中间件都执行完毕了。
  6. 因此,依次输出 1 3 5 4 2 ,这就是洋葱圈模型,先由外向内执行,再由内向外执行。

补充
express 也符合洋葱圈模型,依次输出 1 3 5 4 2

const express = require('express')
const app = express()
app.use((req, res, next)=> {
  console.log('1')
  next()
  console.log('2')
})
app.use((req, res, next)=> {
  console.log('3')
  next()
  console.log('4')
})
app.use((req, res, next)=> {
  console.log('5')
  res.send('hello express')
})
app.listen(3001, ()=> {
  console.log(console.log('server is running at http://127.0.0.1:3001'))
})

3 异步处理

const Koa = require('koa')

const app = new Koa()

app.use(async(ctx, next)=> {
  ctx.data = 'hell'
  await next()
})
app.use(async(ctx, next)=> {
  ctx.data += 'o K'
  await next()
})
app.use(async(ctx, next)=> {
  const res = await Promise.resolve('oa')
  ctx.body = ctx.data += res
})

app.listen(3000, ()=> {
  console.log('server is running at http://127.0.0.1:3000')
})

三. 路由

1 什么是路由

  • 建立URL和处理函数之间的对应关系
  • 根据不同的Method和URL返回不同的内容
const Koa = require('koa')
const app = new Koa()

app.use(ctx=> {
  if(ctx.request.url === '/') {
    ctx.response.body = '这是主页'
  } else if(ctx.request.url === '/users') {
    if(ctx.request.method === 'GET') {
      console.log(1111)
      ctx.response.body = '通过get请求访问的'
    } else if(ctx.request.method === 'POST') {
      ctx.response.body = '通过post请求访问的'
    }
  } else {
    ctx.response.body = '404'
  }
})
app.listen(3000, ()=> {
  console.log('server is running at http://127.0.0.1:3000')
})

ctx.resquest.url 可简写为 ctx.url
ctx.resquest.method 可简写为 ctx.method
ctx.response.body 可简写为 ctx.body

2 使用koa-router

2.1 安装
npm i koa-router
2.2 使用
const Koa = require('koa')
// 引入koa-router
const Router = require('koa-router')

const app = new Koa()
// 实例化koa-router
const router = new Router()

// 编写路由函数
router.get('/list', (ctx)=> {
  ctx.body = ctx
})

router.post('/info', (ctx)=> {
  ctx.body = ctx
})

// 注册路由
app.use(router.routes())

app.listen(3000, ()=> {
  console.log('server is running at http://127.0.0.1:3000')
})
2.3 优化

将router抽离出来,模块化开发
src目录下新增router文件,在改文件夹下新增两个文件users.router.jsrole.router.js

------------------index.js----------------------

const Koa = require('koa')

const app = new Koa()

const userRouter = require('./router/users.router.js')
const roleRouter = require('./router/role.router.js')

app.use(userRouter.routes())
app.use(roleRouter.routes())

app.listen(3000, ()=> {
  console.log('server is running at http://127.0.0.1:3000')
})

------------------users.router.js----------------------

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

const baseUrl = '/users'

const getRealUrl = (url)=> {
  return baseUrl + url
}

router.get(getRealUrl('/list'), (ctx)=> {
  ctx.body = `通过${ ctx.method }方式请求,请求地址为${ ctx.url }`
})

router.post(getRealUrl('/add'), (ctx)=> {
  ctx.body = `通过${ ctx.method }方式请求,请求地址为${ ctx.url }`
})

module.exports = router

------------------role.router.js----------------------

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

const baseUrl = '/role'

const getRealUrl = (url)=> {
  return baseUrl + url
}

router.get(getRealUrl('/list'), (ctx)=> {
  ctx.body = `通过${ ctx.method }方式请求,请求地址为${ ctx.url }`
})

router.post(getRealUrl('/add'), (ctx)=> {
  ctx.body = `通过${ ctx.method }方式请求,请求地址为${ ctx.url }`
})

module.exports = router

四. 请求参数解析

1 get动态路由参数

通过ctx.params来获取

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

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

router.get('/list/:id', (ctx)=> {
  ctx.body = ctx.params
})

app.use(router.routes())

app.listen(3000, ()=> {
  console.log('server is running at http://127.0.0.1:3000')
})

2 get请求参数

通过ctx.query来获取

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

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

router.get('/info', (ctx)=> {
  ctx.body = ctx.query
})

app.use(router.routes())

app.listen(3000, ()=> {
  console.log('server is running at http://127.0.0.1:3000')
})

通过ctx.throw(异常状态码)返回异常状态码

3 post请求参数

  1. 安装koa-body中间件
npm i koa-body
  1. 注册koa-body
const Koa = require('koa')
const app = new Koa()

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

示例代码

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

const app = new Koa()
const router = new Router()
app.use(koaBody())

router.post('/add', (ctx)=> {
	ctx.body = ctx.request.body
})
app.use(router.routes())

app.listen(3000, ()=> {
	console.log('server is running at http://127.0.0.1:3000')
})

五. 错误处理

1 原生错误

  1. 404:没有找到对应路由,或者对应路由没有通过ctx.body进行返回,koa会自动返回404
  2. 通过ctx.throw(400)手动抛出异常
  3. 500:代码错误,koa会自动返回500

2 错误级别中间件

  1. 安装
npm i koa-json-error
  1. 使用
const error = require('koa-json-error')

app.use(error())
// 或者自定义格式
app.use(error(
	function formatError(err) {
		return {
			status: err.status,
      		message: err.message
		}
	}
))

示例代码

const Koa = require('koa')
const Router = require('koa-router')
const koaBody = require('koa-body')
const koaError = require('koa-json-error')

const app = new Koa()
const router = new Router()
app.use(koaBody())

router.post('/add', (ctx)=>{
  // ctx.body = ctx.request.body
  ctx.throw(400, '参数错误')
})

// app.use(koaError())
app.use(koaError(
  function formatError(err) {
    return {
      status: err.status,
      message: err.message
  }
  }
))
app.use(router.routes())

app.listen(3000, ()=> {
  console.log('server is running at http://127.0.0.1:3000')
})

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Koa2是一个基于Node.js的Web开发框架,而MySQL是一种关系型数据库管理系统。将它们结合起来,可以更方便地进行Web开发。 以下是Koa2和MySQL入门的基本步骤: 1. 安装Koa2和MySQL模块 使用npm安装koa和mysql模块: ``` npm install koa mysql ``` 2. 连接MySQL数据库 在应用程序中,需要连接到MySQL数据库。可以使用以下代码: ``` const mysql = require('mysql'); const connection = mysql.createConnection({ host: 'localhost', user: 'root', password: 'password', database: 'database_name' }); connection.connect(); ``` 其中,`host`是数据库服务器的地址,`user`是用户名,`password`是密码,`database`是要连接的数据库名称。 3. 执行SQL查询 连接到数据库后,可以执行SQL查询。以下是一个简单的查询示例: ``` connection.query('SELECT * FROM users', function (error, results, fields) { if (error) throw error; console.log(results); }); ``` 在这个示例中,使用`SELECT`语句从`users`表中检索所有行。查询结果将在控制台中打印出来。 4. 在Koa2中使用MySQL 在Koa2应用程序中,可以使用`koa-mysql`模块来更方便地使用MySQL。以下是一个简单的示例: ``` const Koa = require('koa'); const app = new Koa(); const mysql = require('koa-mysql'); app.use(async (ctx, next) => { const db = await mysql.createPool({ host: 'localhost', user: 'root', password: 'password', database: 'database_name' }); const results = await db.query('SELECT * FROM users'); ctx.body = results; }); app.listen(3000); ``` 在这个示例中,使用`koa-mysql`模块创建一个MySQL连接池。然后,使用`query`方法从`users`表中检索所有行,并将结果作为响应主体发送给客户端。 这只是一个简单的入门示例。在实际应用中,可能需要更复杂的查询和数据操作。但是,通过这个入门示例,您应该已经了解了如何将Koa2和MySQL结合起来进行Web开发。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值