介绍
koa,是基于 Node.js 平台的下一代的 web 开发框架。
是由 Express 原班人马打造,致力于成为一个更小的,更加富裕表现力的,web 框架。
应用 koa 编写 web 利用,能够罢黜反复的回调函数嵌套,并极大的进步错误处理的效率,
koa 框架不仅仅在内核办法中能够绑定任何中间件,它仅仅提供了一个轻量级,优雅的函数库,思路和 express 相差不少。
koa 框架的装置
装置 koa
装置 koa 框架和装置之前的模块一样。
应用如下命令装置
npm install --save koa
应用 save 参数,表明将会主动批改 package.json 文件。主动增加依赖项
hello world
输出如下的代码,运行 hello world
const koa = require("koa");
const app = new koa();
// 配置中间件
app.use(async (ctx) => {ctx.body = "hello world";})
// 监听端口
app.listen(3000);
运行文件
PS C:\Users\Administrator\IdeaProjects\untitled3> node ./ming.js
输入后果如下
异步的解决
因为 js 是单线程的,所以,应用回调函数解决异步等问题。
回调函数解决
const koa = require("koa");
const app = new koa();
function getData(callback){setTimeout(function () {
var name = "ming";
callback(name);
}, 1000)
}
// 从内部获取异步办法里的数据
getData(function (data) {console.log(data)
})
// 监听端口
app.listen(3000);
输入后果
PS C:\Users\Administrator\IdeaProjects\untitled3> node ./ming.js
ming
应用 promise 解决异步
const koa = require("koa");
const app = new koa();
// promise 解决异步
// resolve 胜利的回调函数
// reject 失败的回调函数
var p = new Promise(function (resolve, reject) {setTimeout(function () {var name = "张三";}, 1000)
})
// 获取异步的后果
p.then((data) => {console.log(data);
})
// 监听端口
app.listen(3000);
运行后果如下
PS C:\Users\Administrator\IdeaProjects\untitled3> node ./ming.js
ming
对于 async await promise
其中 async 是异步的缩写,await 被认为是 async wait 的缩写,所以,async 用于申明一个函数为异步的,await 用于期待一个异步办法执行实现。
简略了解
async 让办法变成异步
await 期待异步办法执行实现。
async
理论例子
这里应用理论的例子,更好了解。
同步函数
function getData(){return "ming";}
console,log(getData())
输入后果
PS C:\Users\Administrator\IdeaProjects\untitled3> node ./ming.js
ming
async 能够让该办法变成异步
const koa = require("koa");
const app = new koa();
// promise 解决异步
// resolve 胜利的回调函数
// reject 失败的回调函数
async function getData(){return "这是一个数据";}
console.log(getData());
// 监听端口
app.listen(3000);
输入后果如下所示
其中 promise 为一个异步的数据
PS C:\Users\Administrator\IdeaProjects\untitled3> node ./ming.js
Promise {'这是一个数据'}
获取该数据
const koa = require("koa");
const app = new koa();
// promise 解决异步
// resolve 胜利的回调函数
// reject 失败的回调函数
async function getData(){return "这是一个数据";}
var p = getData();
p.then((data) => {console.log(data);
})
// 监听端口
app.listen(3000);
输入后果如图所示
PS C:\Users\Administrator\IdeaProjects\untitled3> node ./ming.js
这是一个数据
await
应用 await 办法获取到异步的信息
const koa = require("koa");
const app = new koa();
// promise 解决异步
// resolve 胜利的回调函数
// reject 失败的回调函数
async function getData(){return "这是一个数据";}
async function test(){
// 此时运行的为,发现该函数是一个异步函数,遇到了 await 进入期待状态,期待 getData 执行结束,再往下执行
var d = await getData();
console.log(d)
}
test()
// 监听端口
app.listen(3000);
运行后果
PS C:\Users\Administrator\IdeaProjects\untitled3> node ./ming.js
这是一个数据
koa 路由
路由是依据不同的 url 地址,加载不同页面实现不同的性能。
装置路由
npm install --save koa-router
应用路由
const koa = require("koa");
const app = new koa();
const router = require("koa-router")();
router.get("/", (ctx, next) => {ctx.body = "ming";})
// 启动路由
app.use(router.routes());
app.use(router.allowedMethods());
// 监听端口
app.listen(3000);
运行后果如下所示
其中能够增加 async 作为异步办法来调用
const koa = require("koa");
const app = new koa();
const router = require("koa-router")();
router.get("/", async (ctx, next) => {ctx.body = "ming";})
// 启动路由
app.use(router.routes());
// 设置响应头
app.use(router.allowedMethods());
// 监听端口
app.listen(3000);
获取链接的参数值
通过 router 获取路由的参数值
链接为
获取格式化好的
http://localhost:3000/?ming=3
代码为
const koa = require("koa");
const app = new koa();
const router = require("koa-router")();
router.get("/", async (ctx, next) => {
// query 返回的是格式化好的参数对象
// querystring 返回的是申请的字符串
console.log(ctx.query)
ctx.body = "ming";
})
// 启动路由
app.use(router.routes());
// 设置响应头
app.use(router.allowedMethods());
// 监听端口
app.listen(3000);
拜访的后果是
PS C:\Users\Administrator\IdeaProjects\untitled3> node ./ming.js
[Object: null prototype] {ming: '3'}
获取未格式化好的
PS C:\Users\Administrator\IdeaProjects\untitled3> node ./ming.js
ming=3
const koa = require("koa");
const app = new koa();
const router = require("koa-router")();
router.get("/", async (ctx, next) => {
// query 返回的是格式化好的参数对象
// querystring 返回的是申请的字符串
console.log(ctx.querystring)
ctx.body = "ming";
})
// 启动路由
app.use(router.routes());
// 设置响应头
app.use(router.allowedMethods());
// 监听端口
app.listen(3000);
设置动静路由
const koa = require("koa");
const app = new koa();
const router = require("koa-router")();
// 配置动静路由
router.get("/:id", async (ctx, next) => {
// query 返回的是格式化好的参数对象
// querystring 返回的是申请的字符串
console.log(ctx.params)
ctx.body = "ming";
})
// 启动路由
app.use(router.routes());
// 设置响应头
app.use(router.allowedMethods());
// 监听端口
app.listen(3000);
拜访的链接为
http://localhost:3000/ming
输入的内容
PS C:\Users\Administrator\IdeaProjects\untitled3> node ./ming.js
{id: 'ming'}
koa 中间件
这里配置 koa 的中间件
中间件就是匹配路由实现做的一系列的操作,把它称之为中间件。
中间件的性能次要有:
- 执行任何代码
- 批改申请和响应的对象
- 终结申请,响应循环
- 调用堆栈中的下一个中间件。
需要:打印出中间件相干内容
const koa = require("koa");
const app = new koa();
const router = require("koa-router")();
// 中间件
app.use(async (ctx) => {ctx.body = "这是一个中间件";})
// 配置动静路由
router.get("/:id", async (ctx, next) => {
// query 返回的是格式化好的参数对象
// querystring 返回的是申请的字符串
console.log(ctx.params)
ctx.body = "ming";
})
// 启动路由
app.use(router.routes());
// 设置响应头
app.use(router.allowedMethods());
// 监听端口
app.listen(3000);
运行后果
此时拜访任何页面呈现的都是这个内容,
继续匹配
因为拜访的时候,没有加上 next,此时造成的无奈进入到匹配路由的阶段。
const koa = require("koa");
const app = new koa();
const router = require("koa-router")();
// 中间件
app.use(async (ctx, next) => {
ctx.body = "这是一个中间件";
// 进入路由匹配
next();})
// 配置动静路由
router.get("/:id", async (ctx, next) => {
// query 返回的是格式化好的参数对象
// querystring 返回的是申请的字符串
console.log(ctx.params)
ctx.body = "ming";
})
// 启动路由
app.use(router.routes());
// 设置响应头
app.use(router.allowedMethods());
// 监听端口
app.listen(3000);
因为 js 是单线程的,此时须要增加 await,进行拜访。
const koa = require("koa");
const app = new koa();
const router = require("koa-router")();
// 中间件
app.use(async (ctx, next) => {
ctx.body = "这是一个中间件";
// 进入路由匹配
await next();})
// 配置动静路由
router.get("/:id", async (ctx, next) => {
// query 返回的是格式化好的参数对象
// querystring 返回的是申请的字符串
console.log(ctx.params)
ctx.body = "ming";
})
// 启动路由
app.use(router.routes());
// 设置响应头
app.use(router.allowedMethods());
// 监听端口
app.listen(3000);
路由继续匹配
路由因为没有 await next,造成路由匹配到当前就不再匹配,所以增加 next,能把两个雷同的路由依照程序,匹配实现。
const koa = require("koa");
const app = new koa();
const router = require("koa-router")();
// 中间件
app.use(async (ctx, next) => {
ctx.body = "这是一个中间件";
// 进入路由匹配
await next();})
// 配置动静路由
router.get("/:id", async (ctx, next) => {
// query 返回的是格式化好的参数对象
// querystring 返回的是申请的字符串
console.log(ctx.params)
ctx.body = "ming";
await next();})
router.get("/:id", async (ctx, next) => {
// 此时匹配到这点
await next();})
// 启动路由
app.use(router.routes());
// 设置响应头
app.use(router.allowedMethods());
// 监听端口
app.listen(3000);
中间件的执行程序
个别是洋葱模型,作为中间件的执行程序。
错误处理中间件
// 中间件
app.use(async (ctx, next) => {console.log("这是一个中间件");
// 进入洋葱
next()
// 出洋葱
if(ctx.status = 404){
ctx.status = 404;
ctx.body = "这是一个 404 页面";
}
})
第三方中间件
例如进行动态文件托管的时候,应用的是第三方中间件
const static = require('koa-static');
const staticPath = './static';
app.use(static(path.join(__dirname, staticPath);
))
const bodyParser = require('koa-bodyparser');
app.use(bodyParser());
这样就实现了动态文件托管