koa
- 代码编写上避免了多层的嵌套异步函数调用 async await来解决异步
- async await 需要依赖于promise
- 更轻… 减少了内置的中间件 express.static处理静态资源的内置中间件 express.Router() 路由
- 启动步骤
- 引入Koa构造函数对象
const Koa = require('koa')
- 创建服务器示例对象
const app = new Koa();
- 配置中间件
app.use(做什么?)
- 监听端口启动服务器
app.listen(8888);
- 引入Koa构造函数对象
- 做什么? (函数参数说明)
- context上下文对象: 该对象类似原生http中的 req + res
- 该对象的req,res属性也存在,就是原生没有包装过的req,res
- 简单说: context 对象就是从请求到响应 过程中的一个描述对象
- next函数:调用下一个中间件 (当前任务完成可以执行下一个任务)
- context上下文对象: 该对象类似原生http中的 req + res
- request(请求对象): 其中包含客户端请求的相关信息
- response(响应对象): 包含响应数据的具体操作
request常用属性
- ctx.request.url(ctx.url)
- ctx.request.method(ctx.method)
- ctx.request.headers(ctx.headers)
response常用属性
- ctx.response.set(ctx.set) 函数:参数key,val
- ctx.response.status(ctx.status)
- ctx.response.body(ctx.body)
下面是使用koa这个框架的简单代码示例
koa2_start
// 1. 引入Koa构造函数对象 ```const Koa = require('koa')```
const Koa = require('koa')
// 2. 创建服务器示例对象 ```const app = new Koa();```
const app = new Koa() // 可省略new
// 3. 配置中间件 ```app.use(做什么?)```
// app.use('/',(req,res,next)=>{})
app.use(async (ctx,next)=>{
// 响应内容 页面 响应体中
ctx.body = 'hellow word'
})
// 4. 监听端口启动服务器 ```app.listen(8888);```
app.listen(3000,()=>{
console.log('koa is ok')
})
koa2_context
const Koa = require('koa')
const app = new Koa() // 可省略new
// 请求中常用属性
// - ctx.request.url / ctx.url
// - ctx.request.method / ctx.method
// - ctx.request.headers / ctx.headers
app.use(async (ctx,next)=>{
// 请求 ctx.request 响应 ctx.response
// 读头 读行
console.log(ctx.request.url)
console.log(ctx.request.method)
console.log(ctx.request.headers)
// 当前任务执行完毕后;执行下一个任务use
await next()
})
// - ctx.response.set(ctx.set()) __函数:参数key,val__
// - ctx.response.status(ctx.status)
// - ctx.response.body(ctx.body)
// - 以上所有使用的属性,都可以简写 ctx.xxx
app.use(async (ctx,next)=>{
console.log("第二件事")
// 写头 写行 写体
ctx.set('myKey','12345')
ctx.status = 200
ctx.body = '你好'
})
app.listen(3000,()=>{
console.log('koa is ok')
})
koa2_readFile
const Koa = require('koa')
const app = new Koa() // 可省略new
const fs = require('fs')
// 封装异步读取文件方法 返回读到文件中的内容
function asyncRead(){
return new Promise(function(resolve,reject){
// 异步开始;读取文件
fs.readFile('./index.html',function(err,result){
if(err){
reject(err)
}
// 读文件读取成功 告诉外界异步执行完毕
resolve(result)
})
})
}
// promise
// app.use(function(ctx,next){
// ctx.set('content-type','text/html;charset=utf-8')
// ctx.status = 200
// // 路由
// if(ctx.url === '/read'){
// asyncRead().then((res)=>{
// const data = res
// ctx.body = data
// },(err)=>{
// const errs = err
// ctx.body = errs
// })
// }
// })
// asnyc函数 + 等待 await = promise 处理三者合一
// await 代替了promise 对象中 .then
// await 方法() 返回;promise 对象成功或失败后的处理结果
app.use(async (ctx,next)=>{
// 路由
if(ctx.url === '/read'){
let data = await asyncRead()
ctx.set('content-type','text/html;charset=utf-8')
ctx.status = 200
ctx.body = data
}else{
ctx.body = 'ok'
}
})
app.listen(3000,()=>{
console.log('koa is ok')
})
koa2_body
// 读请求体内容
// 如何使用第三方中间件
// 在koa2中很多第三方中间暴露的都是方法; 一般;暴露的方法返回的值为promise对象 这个中间件(模块) 功能 由promise 来完成
// express 框架中第三方中间件;一般暴露的都是对象
const Koa = require('koa')
// bodyParser 中间件(模块) 暴露的是一个方法
const bodyParser = require('koa-bodyparser')
const app = new Koa()
// 将第三方中间件放应用中间件闪
app.use(bodyParser())
app.use(async (ctx,next)=>{
if(ctx.url =='/'){
console.log(ctx.request.body)
// ctx.response.body 缩写 ctx.body
// ctx.response.body = ctx.request.body
ctx.body = ctx.request.body
}
/*
客户端:name=yanqi
{
"name": "yanqi"
}
*/
/*
客户端发的是以下字符串,同时头application/json
{
"name": "json"
}
*/
})
app.listen(3000,()=>{
console.log('koa is ok')
})
koa2_router
// 路由
const Koa = require('koa')
// 与express 区别 在exrpess中是内置的中间件;使用方式 express.Router
// 在koa2中;路由中间间;属于第三方中间件
// 导入模块(中间件)
const Router = require('koa-router')
const app = new Koa()
// 使用第三方中间件
const router = new Router()
router.get('/',async(ctx)=>{
// 响应给页面
ctx.body = '你好我是路由响应的'
})
// 将路由与实例挂钩 (将路由中间挂在到应用中间件上)
// routes() 作用;这个中间会解析http 请求的内容
// allowedMthodes() 作用:
// 优化状态码的处理405 和501 不再是全部的404
// 405代表请求url有,但是没有写该请求方式的响应
// 501服务器不支持该请求方式
app.use(router.routes(),router.allowedMethods())
app.listen(3000,()=>{
console.log('koa is ok')
})
koa2_static_template
const Koa = require('koa');
// 1:引入
const Router = require('koa-router');
const render = require('koa-art-template');
const path = require('path');
const static = require('koa-static')
var app = new Koa();
render(app, {
// 页面查找的目录
root: path.join(__dirname, 'view'),
// 设置后缀名
extname: '.html',
// debug: false 则每次压缩页面及js,包括混淆,静态数据不会实时更新(不每次都读文件)
debug: process.env.NODE_ENV !== 'production'
});
let router = new Router();
router.get('/',async ctx =>{
// ctx.body = 'index';
ctx.render('index');
});
app.use(static(path.join(__dirname), './public/'));
app.use(router.routes())
app.use(router.allowedMethods() )
app.listen(3000);
/**
* 重定向:是通过response 中 Local 改变路由地址;实现跳转页面
* 重写url 是通过拿到request.url 通过改变气请求地址拿到静态资源
*/
目录结构