从项目创建与实现过程中接触到的相关库,做一下使用梳理和全面学习。
第一部分,基础库
本节主要记录一些koa项目一定会使用到的基本相关库,如解决跨域的koa2-cors、解析body数据的koa-boby、静态资源的koa-static、以及koa-session
当前发起请求的域与该请求指向的资源所在的域不一样。我们认为若协议 + 域名 + 端口号均相同,那么就是同域。出于安全起见,浏览器会对跨域请求进行限制,来抵制cors攻击。
<script><img><iframe>
等标签不受同源策略限制,拥有可以从不同域加载并执行资源的特性,来实现数据跨域传输。Access-Control-Allow-Origin: <origin> | * // 说明服务器允许哪些域可以访问该资源
Access-Control-Allow-Methods: <method>[, <method>]* // 指明实际请求所允许使用的HTTP方法
Access-Control-Allow-Headers: <field-name>[, <field-name>]* //指明实际请求中允许携带的首部字段
Access-Control-Max-Age: <delta-seconds> //预检请求能够被缓存多久
Access-Control-Allow-Credentials: true //是否允许发送Cookie
通常我们只需将请求头部这样设置Access-Control-Allow-Origin:*
即可解决跨域阻拦。而koa-cors库便是将这一过程封装起来,从而到达解决请求跨域问题。
npm install koa-cors --save // 安装
import cors from 'koa2-cors'
const app = new Koa()
// 默认使用
app.use(cors())
// 跨域请求配置
app.use(
cors({
origin: function (ctx) { //设置允许来自指定域名请求
return '*';
},
maxAge: 5, //指定本次预检请求的有效期,单位为秒。
credentials: true, //是否允许发送Cookie
allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], //设置所允许的HTTP请求方法
allowHeaders: ['Content-Type', 'Authorization', 'Accept'], //设置服务器支持的所有头信息字段
exposeHeaders: ['auth', 'city'] //设置获取其他自定义字段
})
)
koa-cors
组件使用起来非常的简单,只需安装完后在项目主文件中将其挂载在项目上即可,没有特殊需求,只需简单调用。默认设置已可以解决跨域问题。用户也可以自行配置想过跨域字段的值,通过options
参数来传递配置。
由于数据在传输过程中是以JSON格式进行传递的,如果使用原始node
则需要对数据进行JSON转换,比较繁琐。因此使用koa-boby
与 koa-bodyparser
包可以格式化传递的参数,使数据获取更便捷。
yarn add koa-body
yarn add koa-bodyparser
npm install koa-body
npm install koa-bodyparser
koa-body
的使用koa-body
可以处理请求数据类型为multipart/form-data、application/x-www-form-urlencoded、application/json、application/json-patch+json、application/vnd.api+json、application/csp-report、text/xml常规使用方式如下:const koaBody = require('koa-body')
app.use(koaBody({
// 支持文件格式
multipart: true,
formidable: {
// 保留文件扩展名
keepExtensions: true,
}
}))
koa-body
相关参数配置
patchNode {Boolean}: 在node里获取body数值的方式是否为 ctx.req, 默认为false
patchKoa {Boolean}: 在koa里获取body数值的方式是否为 ctx.request, 默认为true
jsonLimit {String|Integer} 可传输Json格式数据的大小, 默认为1mb
formLimit {String|Integer} 可传输form格式数据的大小, 默认为56kb
textLimit {String|Integer} 可传输text格式数据的大小, 默认为56kb
encoding {String} 编码方式的设置,默认为utf-8
multipart {Boolean} 是否支持 multipart-formdate 的表单,默认为 false
urlencoded {Boolean} 是否支持urlencoded 的表单, 默认为 true
text {Boolean} 是否解析text/plain 的表单, true
json {Boolean} 是否解析JSON格式,default true
jsonStrict {Boolean} 是否使用json严格模式,true 会只处理数组和对象 true
formidable {Object} 配置更多的关于multipart的选项
onError {Function} 自定义错误响应函数
parsedMethods {String[]} 指明要解析数据的请求方法,默认为 ['POST', 'PUT', 'PATCH'].
koa-bodyparser
的使用const bodyParser = require('koa-bodyparser')
app.use(bodyParser())
参数配置和koa-body
类似,在此就不赘述。
在网络请求中,请求往往分成两种类型,一种是静态资源,直接从服务器的文件存储中读取,一种是动态资源,一般需要先从数据库获取数据,然后经过一定的处理,最后返回给客户端。
在项目中使用koa-static
中间件主要是为了获取服务器上存储的静态图片,将其传递给客户端。具体使用如下:
const koaStatic = require('koa-static')
app.use(koaStatic(root,opt))// root为静态文件路径,opt为相关设置
options的可选值
koa-helmet
通过设置头部来保护应用程序安全的目的。此中间件可以抵御常规的web网络攻击。它提供了11个安全中间件。
//统一调用
app.use(helmet());
// 局部组件调用
app.use(helmet.contentSecurityPolicy());
app.use(helmet.dnsPrefetchControl());
app.use(helmet.expectCt());