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
22const 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
14const 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 | // views/index.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
42const 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