Koa
小懵 -Koanpm init -ynpm i koa2 --Spackage.json 配置启动脚本 "start": "node app.js"npm i nodemon -g "start": "nodemon app.js"
没有webpeck 翻译请不要使用import
使用导入koa实例化app对象编写中间件 async将中间件添加至应用 app.use 返回this 也就是app本身启动服务启动监听使用postman 或者 浏览器访问// 一. 导入koa
const Koa = require('koa')
// 二. 实例化对象
const app = new Koa()
// 三. 编写中间件
app.use((ctx) => {
// ctx context http 请求的上下文 ctx.body === ctx.response.body
ctx.body = 'hello Koa2'
})
// 四. 启动服务
app.listen(3000, () => {
console.log('server is running on http://localhost:3000')
})
注意如果没有通过ctx.body
返回给客户端, 最终会得到Not Found
与express 不同 express是所有中间件顺序执行结束后响应.koa遇见next后会跳出当前中间件,执行下一个中间件,直到没有next 然后回到上一个中间件执行next之后的代码,直到第一个。所以在use中, 一次只能接受一个函数做为参数
app.use(async (ctx, next)=> {
console.log(1);
ctx.body='222';
await next();
// 想输出1 必须等待上面的next结束 记得画图
console.log(1);
})
.use(async (ctx, next)=> {
console.log(2);
await next()
console.log(2);
})
.use(async (ctx, next)=> {
console.log(3);
await next()
console.log(3);
})
//输出 1 2 3 2 1
异步处理如果中间件中存在一些异步的代码, Koa也提供了统一的处理方式. 首先, 我们要了解async await语法
1) async await语法async: 声明异步函数
await: 后跟一个promise对象
如果要使用await, 需要在函数声明前加上async
最终在middleware1中, 通过body返回数据
中间件顾名思义, 中间件就是在什么的中间
在请求和响应中间的处理程序有时候从请求到响应的业务比较复杂, 将这些复杂的业务拆开成一个个功能独立的函数, 就是中间件
对于处理请求来说,在响应发出之前,可以在请求和响应之间做一些操作,并且可以将这个处理结果传递给下一个函数继续处理
中间件函数,帮助拆解主程序的业务逻辑,
并且每一个的中间件函数处理的结果都会传递给下一个中间件函数。
就好比工厂里流水线工人清洗一个箱子:
第一个人清洗侧面,第二个人清洗底面,第三个人清洗顶面,。。。
这条流水线结束后,箱子也就清洗干净了
各做各的,不相互影响,又彼此协作
三. 路由1 什么是路由路由建立URL和处理函数(中间件)之间的对应关系主要作用: 根据不同的Method和URL返回不同的内容需求根据不同的Method+URL, 返回不同的内容
要求:
Post请求/users, 返回'创建用户'
原生实现
// 一. 导入koa
const Koa = require('koa')
// 二. 实例化对象
const app = new Koa()
// 三. 编写中间件
app.use((ctx) => {
if (ctx.url == '/') {
ctx.body = '这是主页'
} else if (ctx.url == '/users') {
if (ctx.method == 'GET') {
ctx.body = '这是用户列表页'
} else if (ctx.method == 'POST') {
ctx.body = '创建用户'
} else {
ctx.status = 405 // 不支持的请求方法
}
} else {
ctx.status = 404
}
})
// 四. 启动服务
app.listen(3000, () => {
console.log('server is running on http://localhost:3000')
})
原生书写代码的可维护性差,业务复杂,原生也不够友好。由此出现路由中间件
1) 路由中间件 npm i koa-router
提供了405 501状态 router.allowedMethods通过它来实现
4** 客户端错误 请求方式不支持
5** 服务器错误 服务器没有这种请求方式
在koa的基础上
1. 导入`koa-router`包
2. 实例化router对象
3. 使用router处理路由
4. 注册中间件
// app 入口文件
const Koa = require('koa2');
const Router = require('koa-router');
// 声明应用
const app = new Koa();
const router = new Router();
router.get('/', async ctx => {
ctx.body = 'router'
})
// 注册中间件 router.routes()启动路由 router.allowedMethods()允许任意请求
app.use(router.routes(), router.allowedMethods())
.listen (9000,()=>{
console.log('serve start.....111');
})
2) 路由重定向
路由入口文件中书写
router.redirect('/', '/home') 参数1 用户输入的 参数2是重定向的
3) 子路由
路由入口文件中书写
router.use ('/list', 第一层子路由list.routes(),list.allowedMethods())
4) 404无效路由
5) 错误处理
项目拆解app.js 是入口文件,里面不要写路由的东西。创建一个路由文件夹,但是路由文件也需要拆分,index.js是路由的入口,只做重定向,其他的路由定义不同的js文件