koa2入门笔记
一 什么是koa
koa是基于nodejs的web框架, 是一个中间件框架。
二 中间件
Koa 中间件是简单的函数,它是带有 (ctx, next)形参 的函数。
可以采用两种不同的方法来实现中间件 async function和 common function。编写中间件的最佳做法为使用async function。
ctx(上下文-Context):
每个请求都将创建一个 Context,并在中间件中作为接收器引用,即每个中间件都接收一个 Koa 的 Context 对象,ctx 只是通常为上下文对象的参数名称。
Context 具体方法和访问器:
此笔记值列举写常用的属性:
ctx.req:
Node 的 request 对象
ctx.res:
Node 的 response 对象.
绕过 Koa 的 response 处理是 不被支持的. 应避免使用以下 node 属性:
res.statusCode; res.writeHead(); res.write(); res.end()
Context 对象 将 node 的 request 和 response 对象封装到单个对象中:
ctx.request:
Koa 提供了一个 Request 对象作为 Context 的 request 属性。 Koa的 Request 对象提供了用于处理 http 请求的方法,该请求委托给 node http 模块的IncomingMessage。
request.url #获取请求 URL.
http://example.com/foo/bar?q=1
url为/foo/bar?q=1
request.originalUrl #获取请求原始URL。
request.origin
获取URL的来源,包括 protocol 和 host。
ctx.request.origin
// => http://example.com
request.href
获取完整的请求URL,包括 protocol,host 和 url。
ctx.request.href;
// => http://example.com/foo/bar?q=1
request.method #请求方法。
request.header #请求标头对象。这与 node http.IncomingMessage 上的 headers 字段相同
request.path #获取请求路径名。
request.query
#获取解析的查询字符串, 当没有查询字符串时,返回一个空对象。
例如 “color=blue&size=small”:
{
color: 'blue',
size: 'small'
}
request.querystring #根据 ? 获取原始查询字符串.
request.type
#获取请求 Content-Type 不含参数 “charset”。
const ct = ctx.request.type;
// => "image/png"
request.charset
在存在时获取请求字符集,或者 undefined:
ctx.request.charset;
// => "utf-8"
request.accepts(types)
检查给定的 type(s) 是否可以接受,如果 true,返回最佳匹配,否则为 false
ctx.respons:
Koa提供了一个 Response 对象作为 Context 的 response 属性。 Koa的 Response 对象提供了用于处理 http 响应的方法,该响应委托给 ServerResponse。
#response.body
将响应体设置为以下之一:如果 response.status 未被设置, Koa 将会自动设置状态为 200 或 204。
1.string
Content-Type 默认为 text/html 或 text/plain, 同时默认字符集是 utf-8。Content-Length 字段也是如此。
2.Object,Array JSON-字符串化
Content-Type 默认为 application/json. 这包括普通的对象 { foo: 'bar' } 和数组 ['foo', 'bar']。
3.Buffer 写入
Content-Type 默认为 application/octet-stream, 并且 Content-Length 字段也是如此。
4.Stream 管道
Content-Type 默认为 application/octet-stream。
5.null 无内容响应
#response.status
通过数字代码设置响应状态,默认情况下,response.status 设置为 404
#response.type
设置响应 Content-Type 通过 mime 字符串或文件扩展名。
ctx.type = 'text/plain; charset=utf-8';
ctx.type = 'image/png';
ctx.type = '.png';
ctx.state:
推荐的命名空间,用于通过中间件传递信息和你的前端视图。
ctx.state.user = await User.find(id);
ctx.throw:
ctx.throw([status], [msg], [properties]):
status:转态码
msg:自定义的错误信息,适用于客户端响应,这通常不是错误消息的内容,因为您不想泄漏故障详细信息。
ctx.throw(400);
ctx.throw(400, 'name required');
ctx.throw(400, 'name required', { user: user });
ctx.app:
应用程序实例引用
ctx.assert:
ctx.assert(value, [status], [msg], [properties])
当 !value 时,Helper 方法抛出类似于 .throw() 的错误。这与 node 的 assert() 方法类似.
ctx.assert(ctx.state.user, 401, 'User not found. Please login!');
为方便起见许多上下文的访问器和方法直接委托给它们的 ctx.request 或 ctx.response ,不然的话它们是相同的。 例如 ctx.type 和 ctx.length 委托给 response 对象,ctx.path 和 ctx.method 委托给 request。
next:
next 是调用执行下游中间件的函数. 在代码执行完成后通过 then 方法返回一个 Promise.
洋葱模型
Koa 的中间件之间按照编码顺序在栈内依次执行,允许您执行操作并向下传递请求(downstream),之后过滤并逆序返回响应(upstream)。
const Koa = require('koa');
const app = new Koa();
app.use(async (ctx,next)=>{
console.log(1)
//next是一个异步函数,返回一个promise
//如果不写next,这个路由被匹配后就停止,不会匹配下面的路由.
await next();//该函数暂停并将控制传递给定义的下一个中间件。
console.log(4);
ctx.body = 'hello restful-API';
});
app.use(async (ctx,next)=>{
console.log(2);
await next();
console.log(3)
});
app.listen(3000)
// 打印执行顺序为 1,2,3,4
三 Koa 应用程序
在执行 new Koa() 时创建的对象被称为 Koa 应用对象。
Koa 应用程序是一个包含一组中间件函数的对象,它是按照类似堆栈的方式组织和执行的。
设置
应用程序设置是 app 实例上的属性,目前支持如下:
app.env默认是 NODE_ENV 或 “development”app.keys签名的 cookie 密钥数组app.proxy当真正的代理头字段将被信任时app.subdomainOffset对于要忽略的.subdomains偏移[2]
const Koa = require('koa');
const app = new Koa();
app.proxy = true;
app.listen(…)
应用程序被绑定到 3000 端口。
Koa 应用程序不是 HTTP 服务器的1对1展现。 可以将一个或多个 Koa 应用程序安装在一起以形成具有单个HTTP服务器的更大应用程序。
这意味着您可以将同一个应用程序同时作为 HTTP 和 HTTPS 或多个地址:
const http = require('http');
const https = require('https');
const Koa = require('koa');
const app = new Koa();
http.createServer(app.callback()).listen(3000);
https.createServer(app.callback()).listen(3001);
app.use(function)
将给定的中间件方法添加到此应用程序。
代码示例:匹配任何路由的中间件
const Koa = require('koa');
const app = new Koa();
//1. Koa 是一个中间件框架,Koa应用程序是一个包含一组中间件函数的对象
//2. app.use(function) app.use添加一个中间件,并将给定的中间件方法添加到此应用程序。
//3. ctx context 包含request和respond等数据
// 应用级中间件,匹配任何路由
app.use(async (ctx,next)=>{
//响应数据,相当于原声的res.end(),res.wirte()
ctx.body = 'hello restful-API';
});
// 监听端口
app.listen(3000);
注:本笔记整理的知识来源,koa中文文档。本文档只是对中文文档的总结梳理,加些通俗的表达,使之更加容易理解。
koa2入门笔记的更多相关文章
- 每天成长一点---WEB前端学习入门笔记
WEB前端学习入门笔记 从今天开始,本人就要学习WEB前端了. 经过老师的建议,说到他每天都会记录下来新的知识点,每天都是在围绕着这些问题来度过,很有必要每天抽出半个小时来写一个知识总结,及时对一天工 ...
- ES6入门笔记
ES6入门笔记 02 Let&Const.md 增加了块级作用域. 常量 避免了变量提升 03 变量的解构赋值.md var [a, b, c] = [1, 2, 3]; var [[a,d] ...
- [Java入门笔记] 面向对象编程基础(二):方法详解
什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...
- React.js入门笔记
# React.js入门笔记 核心提示 这是本人学习react.js的第一篇入门笔记,估计也会是该系列涵盖内容最多的笔记,主要内容来自英文官方文档的快速上手部分和阮一峰博客教程.当然,还有我自己尝试的 ...
- redis入门笔记(2)
redis入门笔记(2) 上篇文章介绍了redis的基本情况和支持的数据类型,本篇文章将介绍redis持久化.主从复制.简单的事务支持及发布订阅功能. 持久化 •redis是一个支持持久化的内存数据库 ...
- redis入门笔记(1)
redis入门笔记(1) 1. Redis 简介 •Redis是一款开源的.高性能的键-值存储(key-value store).它常被称作是一款数据结构服务器(data structure serv ...
- OpenGLES入门笔记四
原文参考地址:http://www.cnblogs.com/zilongshanren/archive/2011/08/08/2131019.html 一.编译Vertex Shaders和Fragm ...
- OpenGLES入门笔记三
在入门笔记一中比较详细的介绍了顶点着色器和片面着色器. 在入门笔记二中讲解了简单的创建OpenGL场景流程的实现,但是如果在场景中渲染任何一种几何图形,还是需要入门笔记一中的知识:Vertex Sha ...
- unity入门笔记
我于2010年4月1日硕士毕业加入完美时空, 至今5年整.刚刚从一家公司的微端(就是端游技术+页游思想, 具体点就是c++开发, directX渲染, 资源采取所需才会下载)项目的前端主程职位离职, ...
随机推荐
- 2018-2-13-win10-uwp-BadgeLogo-颜色
title author date CreateTime categories win10 uwp BadgeLogo 颜色 lindexi 2018-2-13 17:23:3 +0800 2018- ...
- c++求中位数
#include <iostream> #include <cassert> #include <stack> #include <math.h> us ...
- xblock架构,链接与加载
首先,xblock是一个模块,edx即edx-platform,在github.com/edx/edx-platform中,此平台有一个专门加载xblock的模块,定义了所有的接口,可以逐一将模块中的 ...
- Spring 事物机制(总结)
Spring两种事物处理机制,一是声明式事物,二是编程式事物 声明式事物 1)Spring的声明式事务管理在底层是建立在AOP的基础之上的.其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加 ...
- Sass函数:unit()函数
unit() 函数主要是用来获取一个值所使用的单位,碰到复杂的计算时,其能根据运算得到一个“多单位组合”的值,不过只充许乘.除运算: >> unit(100) "" & ...
- 嵌入式系统的性能测试(1) – lmbench篇
要评价一个系统的性能,通常有不同的指标,相应的会有不同的测试方法和测试工具.既有比较成熟的商业测试软件,也有许多优秀的开源工具来完成这个任务.本文简要介绍如何使用lmbench来完成系统综合性能测试. ...
- MySQL系列之三查询优化
通常来说,查询的生命周期大致可以按照顺序来看从客户端到服务端,然后在服务器上进行解析,生产执行计划, 执行,并返回结果给客户端.其中的执行阶段可以认为是整个生命周期中最重要的阶段,其中包括了大量为了检 ...
- mysql小知识
char(10): 换行符 char(13): 回车符 UPDATE tablename SET field = REPLACE(REPLACE(field, CHAR(10), ”), CHAR(1 ...
- 用DELPHI中实现RAR文件解压到指定一目录
一个RAR压缩文件,用DELPHI编的程序打开它并解压到某一目录,怎么实现的?自己搞定了例子:winrar.exe e -y C:\WINDOWS\Desktop\ghost.rar d:\ 但新的问 ...
- LUOGU P4783 【模板】矩阵求逆(高斯消元)
传送门 解题思路 用高斯消元对矩阵求逆,设\(A*B=C\),\(C\)为单位矩阵,则\(B\)为\(A\)的逆矩阵.做法是把\(B\)先设成单位矩阵,然后对\(A\)做高斯消元的过程,对\(B\)进 ...