专栏首页与前端沾边Koa入门(一)介绍
原创

Koa入门(一)介绍

1. Koa 简介

koa 是由 Express 原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。使用 koa 编写 web 应用,通过组合不同的 generator,可以免除重复繁琐的回调函数嵌套,并极大地提升错误处理的效率。koa 不在内核方法中绑定任何中间件,它仅仅提供了一个轻量优雅的函数库,使得编写 Web 应用变得得心应手1.1 更小

koa 体积更小(500多行)、轻量。需要单独下载中间件配合开发。express 内置了很多中间件,集成度高。

1.2 富有表现力

需要编写的代码越少,程序就容易维护和调试。可读性高,编译器和人理解更简单。

1.3 更健壮

容错能力强,异常处理方便,程序不会挂掉,很好地抛异常。

2. 中间件机制

学习 Koa 重点在于理解中间件实现原理,对后续引用第三方库中间件时候有更好了解。

Koa 的应用程序其实就是一个包含一组中间件函数的对象,通过 app.use函数来加载中间件(也有引入顺序要求),这个函数有两个参数,context 指的是上下文环境对象,封装了一些属性;next 用于把中间件的执行权交给下游的中间件,在当前中间件中位于 next() 之后的代码会暂停执行,直到最后一个中间件执行完毕,再自下而上依次执行每个中间件中 next 值周的代码,类似于栈的先进后出。这种模型被称作“洋葱圈模型”。

简单的理解中间件呢,我觉得就是两边对称,举个例子:有个数组,奇数个也好,偶数个也罢。

const arr = [1, 2, 3, 2, 1]

程序从走向右执行,1 是一个中间件中的代码,同理 2 3。只是在两个 1 中间有个 next() 指向 22 中有个 next() 指向 3。但是 next() 执行完后还会回到当前的中间件(不知道是否解释清了,还是更乱了😂)

代码实现如下:

后面会详细介绍,大家先了解
// #1
app.use(async (ctx, next)=>{
    console.log(1)
    await next();
    console.log(1)
});
// #2
app.use(async (ctx, next) => {
    console.log(2)
    await next();
    console.log(2)
})

app.use(async (ctx, next) => {
    console.log(3)
})

3. REST

3.1 介绍

REST 是一种风格,是个万维网软件架构的风格,用于创建网络服务。REST 不是指休息的意思,而是 Representational State Transfer 的缩写,即 —— 表现层状态转化。

  • 表现层 把资源具体呈现出来的形式,比如文本可以用txt格式表现,也可以使用JSON格式、二进制格式表现。
  • 状态 指的当前状态,状态可以改变,使用 put 修改,使用 delete 删除等。
  • 转化 通过 http 协议,在客户端和服务端进行数据传输。

3.2 REST的6个限制

  • 客户-服务器(Client-Server)(CS架构)
    • 关注点分离:服务端专注于数据处理,增删改查;客户端专注页面的交互和用户体验。
    • 简单性: 原来的服务端还需要渲染页面,MVC 模式,现在只需要关注数据,减少代码量
    • 可移植性:页面可以方便的移到其他平台,一套代码,接口不变就没问题。
  • 无状态(Stateless)
    • 简单性:所有用户会话信息(用户信息)都保存在客户端,存在本地缓存。不需要由服务端存储记录
    • 可见性:客户端每次请求必须包括所有信息,不能依赖上下文信息
    • 可靠性:前后端完全依靠接口,比较独立,系统稳定
  • 缓存(Cache)
    • 所有服务端响应都要被标为可缓存或不可缓存(cache-control)
    • 减少前后端交互,提升了性能(js 文件,css 文件都可以本地缓存)
  • 统一接口(Uniform Interface)
    • 接口设计尽可能统一通用,提升了简单性、可见性(简单、易学、易维护)
    • 接口与实现解耦,使前后端可以独立开发迭代(开发人员不用在一块,有电脑依靠文档就可以实现快速开发)
  • 分层系统(Layered System)
    • 每层只知道相邻的一层,后面隐藏的就不知道了(前端只知道接口,不了解后面可能存在的代理服务器)
    • 其它层:安全性、负载均衡(流量分发)、缓存层等
  • 按需代码(Code - On - Demand 可选)
    • 客户端可以下载运行服务器传来的代码(比如 js,使用 eval 执行)
    • 常用的不会变的代码放在服务器,减少一些功能,简化了客户端

3.3 统一接口子限制

  1. 资源的标识
  2. 资源是任何可以命名的事物,如用户,评论
  3. 每个资源可以通过URI唯一标识 https://api/github.com/users https://api/github.com/users/day
  4. 表述操作资源
  5. 客户端不能直接操作服务端资源,通过传 json 操作
  6. 自描述信息
  7. 每个消息(请求或相应)必须提供足够的信息让接受者理解
  8. 媒体类型(application/json)
  9. 合理使用 http 方法,get(查), post(增),delete(删)等
  10. 是否缓存: cache-control
  11. 文字链接用于网页跳转

3.4 REST 设计规范

  1. 具体什么样子
  2. 基本的 URI 格式,如 https://api.github.com/users
  3. 标准 http 方法,如 get, post, put, patch, delete
  4. 传输的数据媒体类型,如 JSON
  5. 符合 REST 架构风格的 api
  6. get /users: 获取用户列表
  7. get /users/day 获取用户详情
  8. delete users/1 删除 id1 的用户
  9. put/patch users/1 更新 id1 的用户的信息putpatch 的区别:patch 部分更新,put 整体替换
  10. 响应设计规范
  11. 查询(后台负责接收参数返回数据)
  12. 分页(查询的一种),长列表时,优化页面显示,分页返回
  13. 字段过滤(查询的一种),如果前端不需要的数据可以不用返回,返回指定的字段,减少数据量
  14. 状态码
    • 200 - 请求成功
    • 301 - 资源(网页等)被永久转移到其它URL.
    • 404 - 请求的资源(网页等)不存在
    • 500 - 内部服务器错误
  • 错误处理
    • 输出 JSON 格式错误信息。如果状态码是4xx或者5xx,就应该向用户返回错误信息。一般来说,返回的信息中将 error 作为键名,出错信息作为键值即可
  • 安全 - https - 鉴权,有些页面需要先登录才能查看 - 限流,防刷(做个中间层)http 头部加了 limit 字段,记录请求次数,如果超过,报错。也可以提示登录后获得更多的限流值
  • 开发者友好 - 提供接口文档

4. 参考资料

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • (一)ROS入门介绍

    Must
  • Koa入门(三)Koa 路由

    在 Koa 应用中,通常会使用 koa-router 模块,提供对路由的支持。那为什么需要路由呢?做前后端分离开发的朋友都遇到过,对接接口的时候后台都会提供一个...

    测不准
  • iKcamp新书上市《Koa与Node.js开发实战》

    Node.js 10已经进入LTS时代!其应用场景已经从脚手架、辅助前端开发(如SSR、PWA等)扩展到API中间层、代理层及专业的后端开发。Node.js在企...

    iKcamp
  • iKcamp新书上市《Koa与Node.js开发实战》

    Node.js 10已经进入LTS时代!其应用场景已经从脚手架、辅助前端开发(如SSR、PWA等)扩展到API中间层、代理层及专业的后端开发。Node.js在企...

    iKcamp
  • Flink入门(一)——Apache Flink介绍

    ​ 在当代数据量激增的时代,各种业务场景都有大量的业务数据产生,对于这些不断产生的数据应该如何进行有效的处理,成为当下大多数公司所面临的问题。随着雅虎对hado...

    实时计算
  • [经验分享]——XSS 入门介绍

    腾讯云安全
  • kafka入门介绍

    Spark学习技巧
  • RabbitMQ入门介绍

    RabbitMQ 是一个消息代理。这主要的原理十分简单,就是通过接受和转发消息。你可以把它想象成邮局:当你将一个包裹送到邮局,你会相信邮递员先生最终会将邮件送到...

    Java团长
  • REST 入门介绍

    dudu的 HttpClient + ASP.NET Web API, WCF之外的另一个选择 讨论的人很多,说明RESTful API也开始在.NET 社区中...

    张善友
  • Docker 入门介绍

    Docker简介 ---- Docker是DotCloud开源的、可以将任何应用包装在Linux container中运行的工具。2013年3月发布首个版本,当...

    美团技术团队
  • Android入门介绍

    Android入门介绍 3G、4G 第三代移动通信技术(3rd - Generation),速率一般在几百Kbps,较之前的2G和2.5G在数据传输速度上有很大...

    xiangzhihong
  • Stackstorm 入门介绍

    一句话概况:stackstorm是一个事件驱动的自动化引擎。StackStorm 是一坨功能强大的开源自动化平台,可将通过使用插件封装API的方式,将所有应用程...

    Debian中国
  • Elasticsearch入门介绍

    ES是一个高扩展的、开源的、全文检索的搜索引擎,它提供了近实时的索引、搜索、分析功能。 ES文档翻译与总结参考:ES知识汇总 应用场景 1 它提供了强大...

    用户1154259
  • RabbitMQ01-入门介绍

      前面给大家介绍过了ActiveMQ,本文开始给大家介绍下另一个消息中间件RabbitMQ。

    用户4919348
  • GNS3入门介绍

    第一次遇到GNS3,对它并没有多大的兴趣,因为思科模拟器用过几个,觉得都差不多,再牛的模拟器应该也牛不过cisco官方的packet tracer吧,在做备份I...

    py3study
  • Stackstorm 入门介绍

    一句话概况:stackstorm是一个事件驱动的自动化引擎。StackStorm 是一坨功能强大的开源自动化平台,可将通过使用插件封装API的方式,将所有应用程...

    Debian中国
  • Flink入门介绍

    Apache Flink是一个分布式大数据处理引擎,可以对有限数据流和无限数据流进行有状态计算。可部署在各种集群环境,对各种大小的数据规模进行快速计算。

    用户1217611
  • Feign入门介绍

    除Feign之外,在Java中可以使用的HTTP客户端组件主要有3个,如下: (1)HttpURLConnection,JDK自带 (2)Apache Ht...

    编程随笔
  • Selenium入门介绍

    https://github.com/SeleniumHQ/selenium https://www.selenium.dev/documentation/e...

    编程随笔

扫码关注云+社区

领取腾讯云代金券