共计 6264 个字符,预计需要花费 16 分钟才能阅读完成。
介绍
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());
这样就实现了动态文件托管