koa2学习笔记

本文介绍Koa2的安装配置,通过示例展示如何使用async/await简化异步编程,讲解Koa2特性及中间件开发,包括koa-router、koa-bodyparser和koa-static的使用,以及GET和POST请求数据的处理。
摘要由CSDN通过智能技术生成

快速开始

安装Koa2

//初始化package.json
npm init

//安装 Koa2
npm install koa

hello world

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

app.use(async (ctx) => {
    ctx.body = 'hello Koa2'
});

app.listen(3000);
console.log('server is starting at port 3000')

启动demo

node index.js

async/await使用

function getSyncTime(){
    return new Promise((resolve, reject) => {
        try{
            let startTime = new Date().getTime();
            setTimeout(() => {
               let endTime = new Date().getTime();
               let data = endTime - startTime;
               resolve(data)
            }, 500)
        } catch(err){
           reject(err)
        }
    })
}

async function getSyncData(){
    let time = await getSyncTime();
    let data = `endTime - startTime =${time}`
    return data
}

async function getData() {
    let data = await getSyncData();
    console.log(data)
}

getData();

从上述例子中可以看出async/await的特点:

  • 可以让异步逻辑用同步写法实现
  • 最底层的await返回需要是Promise对象
  • 可以通过多层await function的同步写法代替传统的callback嵌套

Koa2特性

  • 只提供封装好http上下文、请求、响应以及基于async/await的中间件容器
  • 利用es7 async/await 的来处理传统回调嵌套问题和代替koa@1的generator,但是需要node.js7.X版本以上
  • 中间件只支持 async/await封装的,如果要使用koa@1基于generator的中间件,需要通过中间件koa-convert封装一下才能用

async中间件开发

function log(ctx) {
    console.log(ctx.method, ctx.header.host+ctx.url)
};

module.exports = function(){
    return async function(ctx, next) {
        log(ctx);
        next();
    }
}

async中间件在koa2中使用

// async中间件只能在koa2中使用

const Koa = require('koa');
const loggerAsync = require('./middleware/logger-async.js');
const app = new Koa();

app.use(loggerAsync());

app.use((ctx) => {
    ctx.body = 'hello world'
});

app.listen(3000);
console.log(`the server is starting at port 3000`)

koa-router的使用

安装koa-router

npm install koa-router --save-dev

举个栗子

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

//引入koa-router
const Router = require('koa-router');

//子路由1
let home = new Router();

home.get('/', async (ctx) => {
    let html = `
        <ul>
            <li><a href="/page/404">/page/404</a></li>
            <li><a href="/page/helloworld">/page/helloworld</a></li>
        </ul>
    `
    ctx.body = html
});

//子路由2
let page = new Router();

page.get('/404', async (ctx) => {
    ctx.body = 'this is 404 page!'
}).get('/helloworld', async (ctx) => {
    ctx.body = 'this is helloworld page!'
});

//装载所有子路由
let router = new Router();

router.use('/', home.routes(), home.allowedMethods());
router.use('/page', page.routes(), page.allowedMethods());

//加载路由中间件
app.use(router.routes()).use(router.allowedMethods());

app.listen(3000, () => {
    console.log(`the server is starting at port 3000`)
})

GET请求数据获取

使用方法

在koa中,获取get请求数据源头是koa中request对象中的query方法或者queryString方法。query方法返回的是格式化好的参数对象,queryString方法返回的是请求字符串。由于ctx对request的API有直接引用的方式,所以获取GET请求数据有两种途径。

1.从上下文中获取
    ctx.query 请求对象
    ctx.queryString 请求字符串
2.从上下文的request对象中获取
    ctx.request.query 请求对象
    ctx.request.queryString 请求字符串

举个栗子

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

app.use( async (ctx) => {
    let url = ctx.url;
    let request = ctx.request;

    //从上下文中的request对象中获取
    let req_query = request.query;
    let req_queryString = request.queryString;

    //从上下文中获取
    let ctx_query = ctx.query;
    let ctx_queryString = ctx.queryString;

    ctx.body = {
        url,
        req_query,
        req_queryString,
        ctx_query,
        ctx_queryString
    }
})

app.listen(3000, () => {
    console.log(`the server is starting at port 3000`)
});

koa-bodyparser中间件

安装中间件

npm install koa-bodyparser --save

原理

对于POST请求的处理,koa-bodyparser中间件可以将koa上下文中的formData数据解析到ctx.request.body中。

举个栗子

const Koa = require('koa')
const app = new Koa()
const bodyParser = require('koa-bodyparser')

// 使用ctx.body解析中间件
app.use(bodyParser())

app.use( async ( ctx ) => {

  if ( ctx.url === '/' && ctx.method === 'GET' ) {
    // 当GET请求时候返回表单页面
    let html = `
      <h1>koa2 request post demo</h1>
      <form method="POST" action="/">
        <p>userName</p>
        <input name="userName" /><br/>
        <p>nickName</p>
        <input name="nickName" /><br/>
        <p>email</p>
        <input name="email" /><br/>
        <button type="submit">submit</button>
      </form>
    `
    ctx.body = html
  } else if ( ctx.url === '/' && ctx.method === 'POST' ) {
    // 当POST请求的时候,中间件koa-bodyparser解析POST表单里的数据,并显示出来
    let postData = ctx.request.body
    ctx.body = postData
  } else {
    // 其他请求显示404
    ctx.body = '<h1>404!!! o(╯□╰)o</h1>'
  }
})

app.listen(3000, () => {
  console.log('[demo] request post is starting at port 3000')
})

静态资源加载中间件 koa-static的使用

安装

npm install koa-static --save

举个栗子

const Koa = require('koa');
const path = require('path');
const static = require('koa-static');

const app = new Koa();

const staticPath = './static';

app.use(static(
    path.join(__dirname, staticPath)
))

app.use(async (ctx) => {
    ctx.body = 'Hello world'
})

app.use(3000, () => {
    console.log('the server is starting at port 3000')
})

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值