实现自己的Koa2

Posted zhaobao1830

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现自己的Koa2相关的知识,希望对你有一定的参考价值。

Koa就是基于node自带的http模块,经过封装,监听端口,实现ctx(上下文)管理,中间件管理等

例子1、koa监听3000端口,在页面输出值

 1 const Koa = require(koa)
 2 const app = new Koa()
 3 
 4 app.use((ctx) => {
 5   ctx.body = hello koa2
 6 })
 7 
 8 app.listen(3000, function () {
 9   console.log(启动3000端口)
10 })

例子2、http监听3000端口,页面返回值

1 const http = require(http)
2 
3 const server = http.createServer((req,res) => {
4   res.writeHead(200)
5   res.end(hello node)
6 })
7 server.listen(3000, function () {
8   console.log(启动了3000端口)
9 })

例子3、使用http封装一个简单的web服务

 1 const http = require(http)
 2 
 3 class application{
 4   constructor() {
 5     this.callback = () => {}
 6   }
 7 
 8   use(callback) {
 9     this.callback = callback
10   }
11 
12   listen(...args) {
13     const server = http.createServer((req,res) => {
14       this.callback(req, res)
15     })
16     server.listen(...args)
17   }
18 }
19 
20 module.exports = application
 1 const Koa3 = require(./index3)
 2 const app = new Koa3()
 3 
 4 app.use((req,res) => {
 5   res.writeHead(200)
 6   res.end(hello Koa3)
 7 })
 8 
 9 app.listen(3003, function () {
10   console.log(启动3003端口)
11 })

例子4:

koa2中的ctx就是上下文,用来挂载request和response对象

js的get和set方法

 1 const yese = {
 2   _name: 夜色,
 3   get name() {
 4     return this._name
 5   },
 6   set name(val) {
 7     console.log(new name is + val)
 8     this._name = val
 9   }
10 }
11 
12 console.log(yese.name)
13 yese.name = 荷塘月色
14 console.log(yese.name)

加入ctx上下文,封装了http里的request和response

 1 const http = require(http)
 2 
 3 //req是http模块里的
 4 let request = {
 5   get url () {
 6     return this.req.url
 7   }
 8 }
 9 
10 let response = {
11   get body () {
12     return this._body
13   },
14   set body (val) {
15     this._body = val
16   }
17 }
18 
19 // 把上面定义的request和response挂载到context对象中
20 let context = {
21    get url () {
22      return this.request.url
23    },
24    get body () {
25      return this.response.body
26    },
27   set body (val) {
28      this.response.body = val
29   }
30 }
31 
32 
33 class application{
34   constructor() {
35     // 把上面定义的context,request,response挂载到application中
36     this.context = context
37     this.request = request
38     this.response = response
39   }
40 
41   use(callback) {
42     this.callback = callback
43   }
44   listen(...args) {
45     const server = http.createServer(async (req, res) => {
46       let ctx = this.createCtx(req,res)
47       await this.callback(ctx)
48       ctx.res.end(ctx.body)
49     })
50     server.listen(...args)
51   }
52   createCtx (req, res) {
53     let ctx = Object.create(this.context)
54     ctx.request = Object.create(this.request)
55     ctx.response = Object.create(this.response)
56     // 把http里的req赋值给ctx.request的req和ctx.req上
57     ctx.req = ctx.request.req = req
58     ctx.res = ctx.response.req = res
59     return ctx
60   }
61 }
62 
63 module.exports = application

调用

 1 const Koa3 = require(./index7)
 2 const app = new Koa3()
 3 
 4 app.use(async (ctx) => {
 5   ctx.body = hello Koa2 + ctx.url
 6 })
 7 
 8 app.listen(3003, function () {
 9   console.log(启动3003端口)
10 })

 

以上是关于实现自己的Koa2的主要内容,如果未能解决你的问题,请参考以下文章

Node + H5 + WebSocket + Koa2 实现简单的多人聊天

一个基于koa2的微信开发中间件

KOA2框架原理解析和实现

KOA2框架原理解析和实现

iKcamp|基于Koa2搭建Node.js实战(含视频)? 代码分层

node koa2 初体验