koa学习

诙谐的卓别林 2019-08-11 03:20:43
一、koa简介

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

注:
Koa 依赖 node v7.6.0 或 ES2015及更高版本和 async 方法支持.
即便没有给ctx.body 设置响应数据,或访问不存在的路由,页面也会显示Not Found,这是koa底层做了处理,不像原生Node或Express一样页面会一直处于响应状态。

二、koa入门程序
1、首先在项目中安装koa
npm install koa --save


2、 新建一个Js文件
const koa = require('koa');
const app = new koa();
app.use(async(ctx,next)=>{
ctx.body='1';
next();
ctx.body +='2';
});

app.use(async(ctx,next)=>{
ctx.body+='3';
next();
ctx.body+='4';
});

app.use(async(ctx,next)=>{
ctx.body+='5';
next();
ctx.body+='6'
});
//ctx是上下文,next是执行下一个中间件
app.listen(3000);


 3、node运行js文件
浏览器访问  http://localhost:3000/

结果为


koa有中间件机制 中间件机制是个洋葱环

第一个中间件执行完,next() 之后会执行第二个中间件,当执行到最后一个的时候,会一层层返回

引用


执行到最后一个中间件,在从里往外一层层的返回执行


三、路由

Koa中的路由和Express不同,Express是把路由集成在Express中,Koa则需要通过kao-router模块使用。

安装:
npm i koa-router

使用
const Koa = require('koa');
// 直接调用的方式
const router = require('koa-router')();
// 或 单独创建router的实例
const Router = require('koa-router');
const router = new Router();

router.get('/', async ctx => {
ctx.body = 'Hello Router';
})

// 启动路由
app.use(router.routes()).use(router.allowedMethods())
// 以上为官方推荐方式,allowedMethods用在routes之后,作用是根据ctx.status设置response header.

app.listen(3000, err => {
if (err) throw err;
console.log('runing...');
});


四、contenxt

Koa将Node的request 和 response对象都封装到了context中,每次请求都会创建一个ctx,并且在中间件中作为接收器使用。
以下是刚才访问时的ctx对象
let ctx = {
// 请求
request: {
method: 'GET',
url: '/',
// request header
header: {
host: '127.0.0.1:3030',
connection: 'keep-alive',
'cache-control': 'max-age=0',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36',
accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',
cookie: 'connect.sid=s%3AnQtQApNcQ55RmpjnkmQvWNTrdjYhZnlh.1FQUbVqpwpdRj8N6wjv8nOarf8hyzIpcxXN2LPYXGy0'
}
},
// 响应
response: {
status: 200,
message: 'ok',
header: {
'content-type': 'text/plain; charset=utf-8',
'content-length': '9'
}
},
app: {
subdomainOffset: 2,
proxy: false,
env: 'development'
},
originalUrl: '/',
// 原生Node的request对象
req: '<original node req>',
// 原生Node的reponse对象
res: '<original node res>',
socket: '<original node socket>'
}

剖析ctx

1、区分request、response、req、res
requset      ctx的请求对象
response    ctx的响应对象
req      Node的请求对象
res      Node的响应对象


注意
绕过Koa的response是不被处理的,避免使用Node的属性和方法,比如:
res.statusCode
res.writeHead()
res.write()
res.end()


即便使用ctx.res.write()也不会得到预期结果,比如:ctx.res.write('hello'),结果是hellook,会把message的值拼接上。

2、ctx.state
推荐的命名空间,用于通过中间件传递信息到你的前端视图。比如每个页面都要用到用户信息,那就可以挂载在ctx.state。类似于添加全局属性。

ctx.state.userInfo = {
name: 'Jack',
age: 18
}


3、ctx.app
应用程序实例引用

...全文
404 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
hookee 2019-08-12
  • 打赏
  • 举报
回复
y_w_x_k 2019-08-12
  • 打赏
  • 举报
回复

87,921

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧