koa2简单使用

Koa是一个新的web框架,由Express幕后的原班人马打造,致力于成为web应用和API开发领域中的一个更小、更富有表现力、更健壮的基石。通过利用async函数,Koa帮你丢弃回调函数,并有力地增强错误处理。Koa并没有捆绑任何中间件,而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。

kao1与koa2区别

  • koa1采用ES6中的Gnerator生成器函数+yield+promise来处理异步操作
  • koa2基于ES7中的async/await+promise来处理异步操作

    基本操作

  • 安装 npm i koa -g
    安装nodemon监视文件改动自动重启服务器 npm i -g nodemon 使用 nodemon xx.js
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // index.js 体验koa helloworld
    const Koa = require('koa')
    const app = new Koa() // 生成服务器实例
    // ctx 是 koa的应用上下文 next 就是串联中间件的钩子函数
    app.use(async (ctx,next) => {
    ctx.body = 'hello world'
    })
    app.listen(3000)
    // 在命令行执行 node index.js 然后在浏览器访问 localhost:3000 页面输出 hello world

koa核心对象

  • context koa将Node.js的Request请求和Response响应对象封装到Context对象中,通过加工context对象就可以控制返回给用户的内容,koa的每一次请求都将创建一个context,并在中间件中被作为参数引用,context对象内置了一些常用属性,如context.state、context.app、context.cookie、context.throw等

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    const Koa = require('koa')
    const app = new Koa()
    // app.use(async (ctx,next) => {
    // console.log(ctx) // 请求的上下文对象
    // console.log(ctx.request) // ctx的request对象
    // console.log(ctx.response) // ctx的response对象
    // ctx.body = 'hello world'
    // })
    app.use(async ctx => {
    ctx.response.body = {
    url: ctx.request.url,
    query: ctx.request.query,
    querystring: ctx.request.querystring
    }
    })
    // 访问该地址 http://localhost:3000/?name=tew&sex=1 页面打印如下
    /*{
    url: "/?name=tew&sex=1",
    query: { name: "tew", sex: "1" },
    querystring: "name=tew&sex=1"
    }*/
    app.listen(3000)
  • application web服务类

  • request http请求对象
  • response http响应对象

koa中间件

  • 在koa一切的流程都是中间件
  • http请求都会流经预先配置好middleware中
  • 在中间件的执行策略中使用compose将中间件组合在一起依次执行,通过next将控制权向下传递
  • 每个中间件都会拿到http请求的上下文context
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // ./middleware/path.js 定义中间件
    function path(ctx) {
    console.log(ctx.path, 'path')
    }
    module.exports = function(){
    return async (ctx, next) => {
    path(ctx)
    await next() // 必须要有 next()
    }
    }
    // app.js 引入并使用中间件
    const path = require('./middleware/path')
    app.use(path())

koa-views 与 pug模板结合使用

  • npm i pug -S
  • npm i koa-views -S
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    const Koa = require('koa')
    const app = new Koa()
    const views = require('koa-views')
    const { resolve } = require('path')
    app.use(views(resolve(__dirname, './views'),{
    extension: 'pug'
    }))
    app.use(async (ctx, next) => {
    await ctx.render('index', {
    you: 'Luke',
    me: 'Scott'
    })
    })
    app.listen(3333)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// views/index.pug
html(lang="en")
head
meta(charset="UTF-8")
meta(name="viewport", content="width=device-width, initial-scale=1.0")
meta(http-equiv="X-UA-Compatible", content="ie=edge")
title Document
link(rel="stylesheet", href="https://cdn.bootcss.com/twitter-bootstrap/4.1.0/css/bootstrap.min.css")
body
.container
.row
.col-md-8
h1 Hi #{you}
p This is #{me}
.col-md-4
p 测试动态 Pug 模板

puppeteer爬虫

  • npm i puppeteer -S
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    const url = `https://movie.douban.com/tag/#/?sort=U&range=7,10&tags=`
    const puppeteer = require('puppeteer')
    const sleep = time => new Promise(resolve => {
    setTimeout(resolve, time)
    })
    !(async () => {
    console.log('target page')
    const browser = await puppeteer.launch({
    args: ['--no-sandbox'],
    dumpio: false
    })

    const page = await browser.newPage()
    await page.goto(url, {
    waitUntil: 'networkidle2'
    })

    await sleep(3000)
    await page.waitForSelector('.more')

    for (let i=0;i<10;i++){
    await sleep(3000)
    await page.click('.more')
    }

    const result = await page.evaluate(() => {
    var items = $('.list-wp a')
    var links = []
    if (items.length >= 1) {
    items.each((index, item) => {
    let doubanId = $(item).find('div').data('id')
    let title = $(item).find('.title').text()
    let rate = Number($(item).find('.rate').text())
    let poster = $(item).find('img').attr('src').replace('s_ratio', 'l_ratio')
    links.push({ doubanId, title, rate, poster })
    })
    }
    return links
    })
    browser.close()
    console.log(result)
    })()

koa-router 路由

  • npm i koa-router 安装路由
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    // 1. 项目目录新建router/index.js
    const router = require('koa-router') // 引入 koa-router
    const app = new router() // 初始化 router
    const mongoose = require('mongoose') // 引入mongoose
    app.get('/movies/all', async (ctx, next) => { // 定义路由
    const Movie = mongoose.model('Movie') // 得到电影模型实例
    const movies = await Movie.find({}).sort({ //查询所有movie并排序
    'meta.createdAt': -1
    })
    ctx.body = { movies }
    })
    // 2. 入口文件 index.index 使用router中间件
    const Koa = require('koa')
    const router = require('./router')
    const app = new Koa()
    // 引入路由
    app.use(router.routes()).use(router.allowedMethods())
    // 3. 浏览器测试路由 localhost:3000/movies/all

koa脚手架 koa-generator 快速生成koa服务

  • 安装 npm i -g koa-generator
  • 创建项目 koa2 project
  • 启动项目 npm run dev|npm start
  • 设置cookie ctx.cookies.set('timer', new Date().getTime())
  • 获取cookie ctx.cookies.get('timer')

    session

-------------本文结束感谢您的阅读-------------
0%