美文网首页
Koa常用中间件(持续更新)

Koa常用中间件(持续更新)

作者: 龚达耶 | 来源:发表于2019-02-03 20:38 被阅读0次

首先介绍中间件是Koa中一个非常重要的概念。Koa应用程序就是包含一组中间件函数的对象,而且有了async/await语法糖,是中间件写起来更简单。

所有代码github传送门

https://github.com/z1811021/koa-middlewares

首先看最基础的hello wold 版本

const koa = require('koa');
const app = new koa();

//基础 hello wold
app.use(async (ctx, next)=>{
  console.log(ctx.method, ctx.host, ctx.url)
  await next();
  ctx.body = 'hello world'
})
app.listen(3000);
npm install

node app.js

接下来抽象打印ctx方法 host url

const koa = require('koa');
const app = new koa();

// 抽象打印ctx方法 host url
const logger = async (ctx, next) => {
  console.log(ctx.method, ctx.host, ctx.url)
  await next();
}

app.use(logger);
app.use(async (ctx, next)=>{
  ctx.body = 'hello world'
})


app.listen(3000);

此时logger就是中间件。 next用于把中间件的执行权交给下游的中间件。在next()之前使用await是因为next()会返回Promise对象。直到最后一个中间件执行完毕后再自下而上执行next()之后的代码。我们称为洋葱模型

关于Promise的介绍可以看我之前的文章

https://www.jianshu.com/p/2b535c6e63d0

image.png

用代码更好的展示执行顺序

const koa = require('koa');
const app = new koa();

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

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

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

app.listen(3000, ()=>{
  console.log("server is running")
})  

koa-compose

如果要将多个中间件合并成单一中间件,方便重用和导出,可以用koa-compose

const koa = require('koa');
const app = new koa();
const compose = require('koa-compose');

middleware1 = async (ctx, next) => {
  console.log(1);
  await next();
  console.log(6);
}

middleware2 = async (ctx, next) => {
  console.log(2);
  await next();
  console.log(5);
}

middleware3 = async (ctx, next) => {
  console.log(3);
  await next();
  console.log(4);
}

const all = compose([middleware1, middleware2, middleware3])
app.use(all)

app.listen(3000, ()=>{
  console.log("server is running")
}) 

koa-bodyparser

koa-bodeyparser可以把POST的参数解析到ctx.request.body中。如果熟悉Express的话会发现是一样的。

我们将会用到koa-static等会会详细介绍先可以忽略。

前台html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>

<body>
    <form method="post">
        <input type="text" name="name" placeholder="input anything" />
        <button type="submit">submit</button>
    </form>
</body>

</html>

后台app.js

看是否打印了我们传递的数据

const koa = require('koa');
const app = new koa();
const bodyparser = require('koa-bodyparser')
app.use(bodyparser({
  enableTypes:['json', 'form', 'text']
}))

app.use(require('koa-static')(__dirname + '/public'))

app.use(async (ctx, next)=>{
  await next();
  console.log(ctx.request.body)
  let retunData = ctx.request.body
  ctx.body = retunData
})



app.listen(3000);

koa-router

加上koa-router中间件后我们可以直接使用get和post来定位并且减少代码量

const koa = require('koa');
const app = new koa();
const bodyparser = require('koa-bodyparser')
const Router = require('koa-router')
const router = new Router() // 初始化router
app.use(bodyparser({
  enableTypes:['json', 'form', 'text']
}))

app.use(require('koa-static')(__dirname + '/public'))
app.use(router.routes()) // 加载router中间件
app.use(router.allowedMethods()) //对异常码处理


router.get('/', async (ctx, next) => {
  ctx.render('index')
})

router.post('/test1', async (ctx, next)=>{
  let retunData = ctx.request.body
  console.log(ctx.request.body)
  ctx.body = retunData
})

koa-static和koa-view

我们在之前就已经用了koa-static,它是用来加载静态资源
比如

app.use(require('koa-static')(__dirname + '/public'))

而koa-view用来加载html模板文件列入ejs或者pug

const Koa = require('koa')
const app = new Koa()
const views = require('koa-views')
const bodyparser = require('koa-bodyparser')
const Router = require('koa-router')
const router = new Router() // 初始化router

// middlewares
app.use(bodyparser({
  enableTypes:['json', 'form', 'text']
}))

//两种写法
app.use(require('koa-static')(__dirname + '/public')) 

app.use(views(__dirname + '/views', {
  extension: 'pug'
}))


app.use(router.routes()) // 加载router中间件
app.use(router.allowedMethods()) //对异常码处理


router.post('/test1', async (ctx, next)=>{
  let retunData = ctx.request.body
  console.log(ctx.request.body)
  ctx.body = retunData
})

router.get('/', async (ctx, next) => {
  ctx.render('index')
})


app.listen(3000);

相关文章

  • Koa常用中间件(持续更新)

    首先介绍中间件是Koa中一个非常重要的概念。Koa应用程序就是包含一组中间件函数的对象,而且有了async/awa...

  • Koa项目搭建过程

    原文地址:Bougie的博客 Koa项目构建 Koa常用中间件介绍 koa-generator生成的应用已经包含常...

  • Koa2教程(初识篇)

    目录一、定义二、安装三、koa中间件 系列教程Koa2教程(入门篇)Koa2教程(常用中间件篇) 一、定义 一个简...

  • koa必备插件分析:koa-session的内部实现

    koa-session的使用方法 koa-session是在koa应用中用于记录请求者身份的常用中间件,其使用方法...

  • koa系列(三)

    文章内容:koa 中间件 以及 koa 中间件的执行流程。 一、什么是 Koa 的中间件 中间件就是匹配路由之前或...

  • 知识点总结

    Koa2中间件 koa(面向node.js的表达式HTTP中间件框架)、koa-router(路由中间件)、koa...

  • 玩转Koa之koa-router原理解析

    本文将要分析的是经常用到的路由中间件 -- koa-router,详细的介绍了koa-router概述和实现,写的...

  • 8KOA 静态文件

    静态文件 使用 koa-static 中间件实现静态文件访问 安装中间件 使用中间件 使用 koa-mount 自...

  • koa

    koa 学习 中间件 koa-router koa-router 获取get/post请求参数 koa-bodyp...

  • koa常用中间件

    koa-json-error,一个专门处理错误信息的中间件koa-parameter校验参数的中间件cross-e...

网友评论

      本文标题:Koa常用中间件(持续更新)

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