Koa2小结

目录

一、Koa2介绍

什么是框架?

框架和库的区别?

Koa2的安装:

什么是路由?

路由的意义:

Koa中间件

REST是什么?

REST的  6  个限制(重点哟)******

RESTfull API简介

RESTfull API 规范

控制器

获取HTTP请求的参数

错误处理

Koa的错误处理机制

Koa2校验参数


一、Koa2介绍

        Koa2框架是基于Node.js的一个下一代Web开发框架

        官网: https://koa.bootcss.com

        通过async/await 语法高效编写Web Server

        中间件机制,能合理拆分业务代码

什么是框架?

        封装原生代码的API;规范开发的流程和格式;让开发人员更加关注于业务代码和开发效率。

框架和库的区别?

        框架(frame)是唯一的,库(lib)是可以共存的。

        框架关注的是流程,库关注的是某一个功能。

Koa2的安装:

        初始化: npm init -y

        安装:npm install koa2 --save

        安装简写:cnpm i koa2 -S

        使用Koa2编写代码(感觉和http模块很像)

// 引入 koa
const Koa = require('koa');

// 实例化koa
const app = new Koa();

// 处理请求和响应  ctx => context 上下文
// use 是这里的中间件
app.use(ctx => {
    ctx.body = '<h1>Hello World !</h1>'
})

app.listen(3000)

        Koa2脚手架的全局安装:

npm install -g koa-generator  或者  cnpm i -g koa-generator

使用koa2创建项目:

// 使用koa2创建项目

    koa2 项目名称


// 初始化安装依赖  进入项目文件夹中 输入

cnpm i    //或   npm install

什么是路由?

        决定不同的URL返回的结果是不同的

        路由的在Koa2的本质就是“中间件”

路由的意义:

        处理不同的URL

        处理不同的HTTP方法

        解析URL上面的参数

Koa中间件

        Koa的中间件可以看成是一个 "洋葱模型"

// 引入 koa
const Koa = require('koa');

// 实例化koa
const app = new Koa();

// 处理请求和响应  ctx => context 上下文
// use 是这里的中间件
app.use(ctx => {
    console.log(1);
    ctx.body = '<h1>Hello World !</h1>'     // 文件启动后,刷新页面只会显示1,不显示2
})
app.use(ctx => {
    console.log(2);
})

app.listen(3000)

​要想下一个中间件执行,则需要用到async和await

// 引入 koa
const Koa = require('koa');

// 实例化koa
const app = new Koa();

// 处理请求和响应  ctx => context 上下文
// use 是这里的中间件
app.use(async (ctx,next) => {
    console.log(1);
    await next()
    console.log('1-1')
    ctx.body = '<h1>Hello World !</h1>'
})
app.use(async (ctx,next) => {
    console.log(2);
    await next()
    console.log('2-1')
})

app.use(ctx => {
    console.log(3);    //执行的结果为 1 2 3 2-1 1-1 实现异步执行
})
app.listen(3000)

使用koa-router实现路由(使用koa也可实现以下代码,使用koa中间件的ctx.url判断去实现路由访问的效果,使用ctx.method来判断访问的方法是什么方法,使用ctx.body渲染页面)

// 引入
const Koa = require('koa');
const Router = require('koa-router');

const app = new Koa();
const router = new Router({
    prefix: '/user'         //路由url的前缀 http://localhost:3000/user
})

router.get('/',async ctx => {
    ctx.body = '这是用户首页'
})

router.get('/del',async ctx => {
    ctx.body = '删除用户'
})

router.post('/add',async ctx => {
    ctx.body = '添加用户'
})
// 使用中间件
app.use(router.routes())

// 监听的端口号
app.listen(3000)

REST是什么?

        REST是万维网软件架构风格(可直接理解为 style风格)

        REST(Representational State Transfer)数据表现形式  当前状态或数据  数据传输

REST的  6  个限制(重点哟)******

        1、客户端-服务端(Client/Server)

                关注点分离

                服务端专注与数据存储,提升了简单性

                前端专注于用户界面,提升了可移植性

        2、无状态(Stateless)

                所有用户会话信息都保存在客户端(服务端不用保存会话信息)

                每次请求必须包含所有信息

                不能依赖上下文信息

                简单性、可靠性、可见性

        3、缓存(Cache)

                所有服务端响应都要被标为可缓存(比如css,js这些不长变得静态文件)不可缓存(比如经常变的接口信息,数据)

                减少前后端交互,提升性能

        4、统一接口(Uniform Interface)**

                接口设计尽可能统一通用

                接口解耦,是前后端独立开发

        5、分层系统(Layered System)

                每层只知道相邻的一层

                客户端不知道是和代理还是真实服务器通信

                其他层:安全层、负载均衡、缓存层

        6、按需代码(Code-On-Demand)(不是特别重要)

                客户端可以下载运行服务端传来的代码

                通过减少功能,简化客户端

RESTfull API简介

        RESTful  API具体什么样子?

                基本的URI,如  https://api.github.com/users

                标准的HTTP方法,如:GET、POST、DELETE、PUT等

                传输的数据媒体类型,如:JSON、XML

RESTfull API 规范

        1、请求设计规范

                URI使用名词,尽可能使用复数,如/users

                URI使用嵌套表示关联关系,如 /users/12/repos/5

                使用正确的的请求方法,如GET、POST、PUT等

                不符合CRUD的情况:POST/action/子资源

控制器

        1、什么是控制器?

                拿到路由分配的任务,并执行。(在koa中可以理解为控制器就是中间件

        2、为什么要使用控制器呢?

                获取HTTP请求参数、处理业务逻辑。

获取HTTP请求的参数

        获取GET请求中的URL中的参数  /xxx/xxx?wd=xxx;可使用 

let {id} = ctx.request.query

// 或  let {id} = ctx.query

        获取POST请求中的body中的参数,需要先安装koa-bodyparser这个中间件,然后引用

// 引入
const Koa = require('koa');
const Router = require('koa-router');
const  bodyparser = require('koa-bodyparser')

const app = new Koa();
const router = new Router({
    prefix: '/user'         //路由url的前缀 http://localhost:3000/user
})

router.get('/',async ctx => {
    ctx.body = '这是用户首页'
})

// 模拟获取query中的数据
router.get('/del',async ctx => {
    // let {id} = ctx.request.query;
    let {id} = ctx.query;
    console.log(id);
    ctx.body = '删除用户'
})


// 模拟获取 body中的数据
router.post('/add',async ctx => {
    let {username,pwd} = ctx.request.body
    console.log(username,pwd);
    ctx.body = '添加用户'
})
// 使用中间件
app.use(bodyparser())
app.use(router.routes())

// 监听的端口号
app.listen(3000)

        获取请求中的路由参数(http://127.0.0.1/user/find/:id)

// 引入
const Koa = require('koa');
const Router = require('koa-router');

const app = new Koa();
const router = new Router({
    prefix: '/user'         //路由url的前缀 http://localhost:3000/user
})


// 模拟获取 路由中的数据
router.get('/find/:id',async ctx => {
    let {id} = ctx.params;
    console.log(id);
    ctx.body = '删除用户'
})


// 使用中间件
app.use(router.routes())

// 监听的端口号
app.listen(3000)

错误处理

        什么是错误处理?

                编程语言或计算机硬件中的一种机制;处理软件或信息系统中出现的一些异常状态。

        异常状况有哪些?

                在RESTful这种编写风格中是指:运行时错误500;逻辑错误:404未找到、412先决条件失败、422无法处理的实体。

        为什么要错误处理?

               防止程序挂掉、告诉用户错误信息、便于开发者调试。

Koa的错误处理机制

// 引入
const Koa = require('koa');
const bodyparser = require('koa-bodyparser');
const router = require('./routes/user')
const app = new Koa();

// 自己编写一个异常处理的中间件
app.use(async (ctx,next) => {
    try {
        await next();       // 如果没有错误,那么就执行洗一个
    } catch (error) {       // 抛出错误,就扑或异常
        ctx.status = error.status;
        ctx.body = {
            message: error.message
        }
    }
})
app.use(bodyparser)
app.use(router.routes())

app.listen(3000)

        在koa2中有一个错误处理机制的一个中间件——koa-json-error

// 下载 koa-json-error 模块处理koa服务中的一些异常
npm install koa-json-error --save    //或 cnpm i koa-json-error --save

        使用koa-json-error捕获异常

// 引入
const Koa = require('koa');
const bodyparser = require('koa-bodyparser');
const jsonError= require('koa-json-error');
const app = new Koa();

app.use(jsonError())
app.use(bodyparser)
app.use(router.routes())

app.listen(3000)

Koa2校验参数

controllers文件下的user.js文件

let userList = [{username: 'tom',pwd: '123'}]

// 添加用户
const add = async (ctx) => {
    ctx.verifyParams({          //处理前的校验
        username: {
            type: 'string',
            require: true
        },
        pwd: {
            type: 'string',
            require: true
        },
    })

    let {username,pwd} = ctx.request.body
    userList.push({
        username,
        pwd
    })
    ctx.body = {
        code: 200,
        msg: '添加成功'
    }
}

// 修改用户
const update = async (ctx) => {
    let user = ctx.request.body
    userList.splice(Number(user.id),1,{
        username: user.username,
        pwd: user.pwd
    })
    ctx.body = {
        code: 200,
        msg: '修改成功'
    }
}

// 删除用户
const deleteUser = async (ctx) => {
    let {id} = ctx.request.body
    userList.splice(Number(user.id),1)
    ctx.body = {
        code: 200,
        msg: '删除成功'
    }
}

// 查询用户
const find = async (ctx) => {
    ctx.body = {
        data: userList
    }
}

// 查询单个用户
const findOne = async (ctx) => {
    let {id} = ctx.params.id
    ctx.body = {
        code: 200,
        user: userList[Number(id)]
    }
}


module.exports = {
    add,
    update,
    deleteUser,
    find,
    findOne
}

app.js中的使用koa-parameter校验中间件

// 引入
const Koa = require('koa');
const jsonError= require('koa-json-error');
const bodyparser = require('koa-bodyparser');
const parameter = require('koa-parameter');     //校验
const router = require('./routes/user')
const app = new Koa();


app.use(jsonError)
app.use(bodyparser)
app.use(parameter)      //校验要在post提交之后进行
app.use(router.routes())

app.listen(3000)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BlackStar-Coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值