koa 使用

news2024/12/23 5:42:42

(贴个官网,koa 内容真不多,非常的小巧轻量)

1. koa 是什么

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

基础样例:

const koa = require("koa");

const app = new koa(); // express 不用 new,是 const app = express();

app.use(async (ctx, next) => { // 为应用添加指定的中间件
    console.log(ctx.request.path); // 打印请求的 url 路径部分
    // ctx.response.body = "<b>Hello World</b>"; // 设置响应体 
    // ctx.response.body = "Hello World"; // 设置响应体
    ctx.response.body = {name: "bob"}; // 设置响应体
})

app.listen(3000); // 监听 3000 端口

2. ctx 参数

该 context 在每个 request 请求中被创建,在中间件中作为接收器来引用,或者通过 this 标识符来引用,其身上几个重要的属性:

  1. ctx.req:Node 的 request 对象
  2. ctx.res:Node 的 response 对象
  3. ctx.request:Koa 的 Request 对象
  4. ctx.response:Koa 的 Response 对象
  5. ctx.cookies.get(name, [options]):获得 cookie 中名为 name 的值,options 为可选参数
  6. ctx.cookies.set(name, value, [options]):设置 cookie 中名为 name 的值,options 为可选参数
  7. ctx.throw([status], [msg], [properties]):抛出包含 .status 属性的错误,默认为 500。该方法可以让 Koa 准确的响应处理状态,例 ctx.throw(400, ‘name required’, { user: user });

【注:app.context 是从中创建 ctx 的原型。 可以通过编辑 app.context 向 ctx 添加其他属性,当需要将 ctx 添加到整个应用程序中使用的属性或方法时,这将会非常有用。例,向 ctx 中添加对数据库的引用】

app.context.db = db();

app.use(async ctx => {
  console.log(ctx.db);
});

【注:许多 context 的访问器和方法为了便于访问和调用,简单的委托给他们的 ctx.request 和 ctx.response 所对应的等价方法, 比如说 ctx.type,ctx.length,ctx.body 代理了 response 对象中对应的方法,ctx.path,ctx.method,ctx.header 代理了 request 对象中对应的方法】

3. next 参数

当执行到 next 语句时,Koa 暂停了该中间件,继续执行下一个符合请求的中间件,执行完后,然后将控制权再逐级返回给上层中间件

下面的例子在页面中返回 “Hello World”,然而当请求开始时,请求先经过 x-response-time 和 logging 中间件,并记录中间件执行起始时间。 然后将控制权交给 reponse 中间件。当一个中间件调用next()函数时,函数挂起并控件传递给定义的下一个中间件。在没有更多的中间件执行下游之后,堆栈将退出,并且每个中间件被恢复以执行其上游行为

const Koa = require('koa');
const app = new Koa();

// x-response-time

app.use(async (ctx, next) => {
  const start = Date.now();
  await next();
  const ms = Date.now() - start;
  ctx.set('X-Response-Time', `${ms}ms`);
});

// logger

app.use(async (ctx, next) => {
  const start = Date.now();
  await next();
  const ms = Date.now() - start;
  console.log(`${ctx.method} ${ctx.url} - ${ms}`);
});

// response

app.use(async ctx => {
  ctx.body = 'Hello World';
});

app.listen(3000);

4. request 对象

Koa Request 对象是对 node 的 request 进一步抽象和封装,提供了日常 HTTP 服务器开发中一些有用的功能,常用api有:

  1. request.header:获得或设置请求头对象(request.headers 等价)
  2. request.method:获得或设置请求方法
  3. request.length:以数字的形式返回 request 的内容长度(Content-Length),或者返回 undefined
  4. request.url:获得或设置请求 url 地址
  5. request.href:获取完整的请求URL, 包含 protocol, host 和 url
  6. request.path:获取请求路径名,或设置请求路径名并保留当前查询字符串
  7. request.querystring:获取查询参数字符串(url中?后面的部分,不包含?),或设置原始查询字符串
  8. request.search:获取查询参数字符串(包含?),或设置原始查询字符串
  9. request.type:获取请求 Content-Type,不包含像 “charset” 这样的参数
  10. request.is(types…): 检查请求所包含的 “Content-Type” 是否为给定的 type 值。 如果没有 request body,返回 undefined。 如果没有 content type,或者匹配失败,返回 false。 否则返回匹配的 content-type
    // When Content-Type is application/json
    ctx.is('json', 'urlencoded'); // => 'json'
    ctx.is('application/json'); // => 'application/json'
    ctx.is('html', 'application/*'); // => 'application/json'
    
    ctx.is('html'); // => false
    
  11. request.charset:获取请求 charset(例"utf-8"),没有则返回 undefined
  12. request.query:将查询参数字符串进行解析并以对象的形式返回,如果没有查询参数字字符串则返回一个空对象,或根据给定的对象设置查询参数字符串。注意,该方法不支持嵌套解析
  13. request.fresh:检查请求缓存是否 “fresh”(内容没有发生变化)。该方法用于在 If-None-Match / ETag, If-Modified-Since 和 Last-Modified 中进行缓存协调。当在 response headers 中设置一个或多个上述参数后,该方法应该被使用
  14. request.stale:与 req.fresh 相反
  15. request.protocol:返回请求协议,“https” 或者 “http”。 当 app.proxy 设置为 true 时,支持 X-Forwarded-Host
  16. request.socket:返回请求的 socket
  17. request.get(field):返回请求头中 field 字段的值

5. response 对象

Koa Response 对象是对 node 的 response 进一步抽象和封装,提供了日常 HTTP 服务器开发中一些有用的功能,常用api有:

  1. response.socket:响应套接字(套接字就是 socket),作为 request.socket 指向 net.Socket 实例
  2. response.header:响应头对象(response.headers 等价)
  3. response.status:获取响应状态(默认情况下,response.status设置为404,而不像node’s res.statusCode默认为200),或通过数字设置响应状态
  4. response.message:获取响应状态消息(默认情况下, response.message关联response.status),或将响应状态消息设置为给定值
  5. response.body:获取响应体,或设置响应体(如果此时 res.status 没有赋值,Koa会自动设置为 200 或 204)
  6. response.length:以数字返回响应的 Content-Length,或者从ctx.body推导出来,或者undefined,或将响应的 Content-Length 设置为给定值
  7. response.set(field, value):设置 response header 字段 field 的值为 value
  8. response.append(field, value):添加额外的字段 field 的值为 val
  9. response.set(fields):使用对象同时设置 response header 中多个字段的值
  10. response.remove(field):移除 response header 中字段 filed
  11. response.type:获取 response Content-Type,不包含像"charset"这样的参数,或通过 mime 类型的字符串或者文件扩展名设置 response Content-Type
  12. response.redirect(url, [alt]):执行 [302] 重定向到 url,如果想要修改默认的 [302] 状态码,直接在重定向之前或者之后执行即可。如果要修改 body,需要在重定向之前执行
    【字符串 “back” 是特殊参数,其提供了 Referrer 支持。当没有 Referrer 时,使用 alt 或者 / 代替】
    ctx.redirect('back');
    ctx.redirect('back', '/index.html');
    ctx.redirect('/login');
    ctx.redirect('http://google.com');
    
  13. response.headerSent:检查 response header 是否已经发送,用于在发生错误时检查客户端是否被通知
  14. response.lastModified:如果存在 Last-Modified,则以 Date 的形式返回,或以 UTC 格式设置 Last-Modified,可以使用 Date 或 date 字符串来进行设置

6. koa1,koa2 和 express 的区别

  1. 实现异步方式不同,koa1 实现异步是通过 generator/yield,koa2 实现异步是通过 async/awaite,而 express 实现异步是通过回调函数的方式
  2. express 是大而全,内置了大多数的中间件,更让人省心,koa2 不绑定任何的框架,干净简洁,小而精,更容易实现定制化,扩展性好,koa 中想实现 express 很多功能需要借助第三方中间件解决
    在这里插入图片描述
  3. express 本身是不支持洋葱模型的数据流入流出能力的(类似于线型),需要引入其他的插件,而在 koa 中,一切的流程都是中间件,数据流向遵循洋葱模型,先入后出,是按照类似堆栈的方式组织和执行的,koa 的数据流入流出,next() 后,会进入下一个中间件并执行,然后从最后一个中间件反向执行
    const Koa = require('koa')
    const app = new Koa()
    
    const mid1 = async (ctx, next) => {
        ctx.body =  '前:' + '1\n'
        await next()
        ctx.body =   ctx.body + '后:' + '1\n'
    }
    
    const mid2 = async (ctx, next) => {
        ctx.body =    ctx.body + '前:'+ '2\n'
        await next()
        ctx.body =    ctx.body + '后:'+ '2\n'
    }
    
    const mid3 = async (ctx, next) => {
        ctx.body =  ctx.body + '前:'+  '3\n'
        await next()
        ctx.body =   ctx.body + '后:'+ '3\n'
    }
    
    app.use(mid1)
    app.use(mid2)
    app.use(mid3)
    
    app.listen(3000)
    
    // 前1
    // 前2
    // 前3
    // 后3
    // 后2
    // 后1
    
  4. koa 新增 context 对象,作为这次请求的上下文对象,除了提供了大量便捷的 api 辅助开发,还可以在其上面保存一些公有的参数数据来使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/100725.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于新正方教务系统(湖北工程学院)的one day越权漏洞的说明

关于正方教务系统漏洞的说明 此漏洞基于湖北工程学院教务管理系统进行演示&#xff0c;漏洞覆盖新正方教务系统8.0以下版本&#xff0c;为本人一年前提交的漏洞&#xff0c;所以并非0day漏洞 此漏洞影响范围巨大&#xff0c;几乎涉及国内一半高校的教务系统&#xff0c;包含武…

我国油气行业勘探开发投入提升 石油资源存在供需短缺矛盾 天然气需求高速发展

根据观研报告网发布的《2022年中国油气市场分析报告-市场竞争策略与发展动向前瞻》显示&#xff0c;油气是指石油和伴生的天然气&#xff0c;被誉为“能源之王”、“工业的血液”&#xff0c;是全世界各国的战略性产业。油气资源种类多样&#xff0c;根据开采难度可分为两大类&…

Python:三方库安装路径及路径变更

文章目录一、安装三方库的几种方式二、指定第三方库的镜像源三、查看安装默认路径四、修改安装默认路径五、查看安装的库六、导出库安装文件七、安装小结一、安装三方库的几种方式 1.直接pip install安装&#xff08;有网的环境下通用&#xff09; &#xff1a; 在python–>…

CSDN上讲得最好的——Linux权限

目录 一、shell原理精讲 二、Linux权限概念 三、权限管理 1、访问者分类 2、文件类型及访问权限 3、表示方法 4、设置方法 &#xff08;1&#xff09;chmod (2)chown (3)chgrp (4)umask 四、目录权限 五、粘滞位 一、超级管理员删除 二、该目录的所有者删除 三、…

GDAL之重投影(详细篇)

一、空间坐标系对应EPSG编号 二、通用横向墨卡托(UTM)投影坐标系和WGS84地理坐标系转换 一、目标地区的编号查看(中国东部地区属于UTM Zone 50N) 从180“W开始&#xff0c;有60个纵向投影区&#xff0c;编号为1到60。除了挪威和斯瓦尔巴群岛附近的一些例外&#xff0c;每个区…

【毕业设计_课程设计】基于 U-Net 网络的遥感图像语义分割(源码+论文)

文章目录0 项目说明1 研究目的2 研究方法3 研究结论4 论文目录5 项目工程0 项目说明 **基于 U-Net 网络的遥感图像语义分割 ** 提示&#xff1a;适合用于课程设计或毕业设计&#xff0c;工作量达标&#xff0c;源码开放 实验训练使用 Anaconda 版 Python 3.7 下的 TensorFlo…

OpenSSL BIO源码简析

文章目录1. BIO简介BIO chainBIO数据结构BIO_METHOD数据结构2. Base64示例分析初始化构造BIO链写数据free1. BIO简介 相关文档 /html/man7/bio.html /html/man3/BIO_*.htmlbio - Basic I/O abstraction&#xff0c;即IO抽象层。 BIO有两种: source/sink BIO&#xff0c;即数…

win7系统升级IE11,打补丁KB2729094失败解决办法

因银行这边很多都需要IE11版本&#xff0c;但win7系统大部分需要打一些补丁才能安装。其他补丁都打上了&#xff0c;唯独这个KB2729094一直失败&#xff0c;搞得很无语。还好找到可以直接用命令安装。就不需要打这个补丁了&#xff0c;直接安装使用即可。 1、下载IE11离线安装…

DBCO-PEG-Dopamine,二苯并环辛炔-聚乙二醇-多巴胺,DBCO聚乙二醇衍生物

●中文名&#xff1a;二苯并环辛炔-聚乙二醇-多巴胺&#xff0c;多巴胺聚乙二醇环辛炔 ●英文名&#xff1a;DBCO-PEG-Dopamine&#xff0c;Dopamine-PEG-DBCO ●外观以及性质&#xff1a; DBCO-PEG-Dopamine产物呈固体或粘性液体&#xff0c;取决于PEG分子量&#xff0c;DBCO…

“R语言+遥感”的水环境综合评价方法

目标&#xff1a; 1、掌握R语言基础应用及水环境数据分析方法 2、掌握水环境遥感数据预处理方法 3、掌握水线提取——水体指数与阈值混合法&#xff08;遥感&#xff09; 4、掌握水深提取——多元回归分析方法&#xff08;R语言遥感&#xff09; 5、掌握水温提取——支持向…

(附源码)springboot学生社团信息管理 毕业设计 011238

目 录 摘要 1 1 绪论 1 1.1 研究背景 1 1.2 研究意义 1 1.3论文结构与章节安排 1 2 学生社团信息管理系统系统分析 3 2.1 可行性分析 3 2.2 系统流程分析 3 2.2.1 数据增加流程 4 2.2.2 数据修改流程 4 2.2.3 数据删除流程 5 2.3 系统功能分析 5 2.3.1 功能性分析 5 2.3.2 非功…

D. Secret Santa(构造)

Problem - 1530D - Codeforces 每年12月&#xff0c;VK都会为其员工举办名为 "秘密圣诞老人 "的传统活动。它是这样发生的。 从1到n的n名员工参加了这个活动。每个员工i被分配到一个不同的员工bi&#xff0c;员工i必须给这个员工做一份新年礼物。每个员工正好被分配…

如何使用Chrome浏览器模拟弱网情况

点击谷歌浏览器图标 打开浏览器后&#xff0c;按下F12键 弹出开发者工具窗口 刷新网页&#xff0c;页面的加载速度为597ms 在开发者工具中&#xff0c;点击Online&#xff0c;在弹出的菜单中点击Slow 3G&#xff08;慢速3G网络&#xff09; 重新加载网站&#xff0c;…

PyTorch logit函数

1.PyTorch vs TensorFlow tensorflow是静态图&#xff0c;需要你把啥都准备好&#xff0c;然后它像个傻子一样执行&#xff0c;tensorflow&#xff0c;目前业界更适合部署&#xff0c;毕竟是静态图&#xff0c;infer的时候速度快。 pytorch&#xff0c;它会在执行的时候&…

Android -- 每日一问:如何检测内存泄露,如何进行内存优化?

经典回答 Android 系统为每一个应用程序都设置了一个硬性的 Dalvik Heap Size 最大限制阈值&#xff0c;这个阈值在不同的设备上会因为 RAM 大小不同而各有差异。如果你的应用占用内存空间已经接近这个阈值&#xff0c;此时再尝试分配内存的话&#xff0c;很容易引起 OOM 。 …

效果分析的关键是指标能算出来……

看到题目会不会有一些奇怪&#xff1f; 这算什么关键…… 经历过才知道&#xff0c;这是一个不起眼但却极为重要的部分&#xff0c;企业在数据驱动发展进程中必然会遇到指标算不出来的情况&#xff0c;而且随着企业规模的不断扩大&#xff0c;这一问题会持续伴随。“指标能算…

[附源码]Python计算机毕业设计Django学习互助辅助系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

外汇天眼:美国12月Markit制造业PMI初值不及预期 市场担忧经济下滑

美国12月企业活动进一步萎缩&#xff0c;因新订单降至两年半以来最低水平&#xff0c;但需求疲软帮助大幅冷却通胀。标普全球(NYSE:SPGI)周五表示&#xff0c;追踪制造业和服务业的美国综合PMI产出指数预览值本月从11月的46.4降至44.6。这是该指数连续第六个月低于私营部门萎缩…

Python学习-9.1 程序界面-main函数的作用

main函数的两种使用功能 情况1&#xff1a;直接执行本py代码文件时&#xff0c;把包含的代码块视为脚本代码顺序执行&#xff1b; 情况2&#xff1a;当本py代码文件作为其他代码import对象时&#xff0c;不执行如下被包含的代码 下面可以通过程序来更好地了解main函数的作用&a…

java-函数式编程浅谈

了解函数式编程的实际应用场景以及优点。 文章目录什么是函数式编程函数式编程的使用原理解析什么是函数式编程 以数学中的函数作为切入点&#xff0c;只关注参数之间的运算满足某种规则&#xff0c;例如zxy。 那么如何体现在编程中呢&#xff0c;熟知的function定义可以作为…