Node之koa框架

koa

  • 代码编写上避免了多层的嵌套异步函数调用 async await来解决异步
    • async await 需要依赖于promise
  • 更轻… 减少了内置的中间件 express.static处理静态资源的内置中间件 express.Router() 路由
  • 启动步骤
    1. 引入Koa构造函数对象 const Koa = require('koa')
    2. 创建服务器示例对象 const app = new Koa();
    3. 配置中间件 app.use(做什么?)
    4. 监听端口启动服务器 app.listen(8888);
  • 做什么? (函数参数说明)
    • context上下文对象: 该对象类似原生http中的 req + res
      • 该对象的req,res属性也存在,就是原生没有包装过的req,res
      • 简单说: context 对象就是从请求到响应 过程中的一个描述对象
    • next函数:调用下一个中间件 (当前任务完成可以执行下一个任务)
  • 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  通过改变气请求地址拿到静态资源
 */

目录结构
目录结构

猜你喜欢

转载自blog.csdn.net/qq_43245746/article/details/89884995