目录
一、Koa2介绍
Koa2框架是基于Node.js的一个下一代Web开发框架
官网: https://koa.bootcss.com
通过async/await 语法高效编写Web Server
中间件机制,能合理拆分业务代码
什么是框架?
封装原生代码的API;规范开发的流程和格式;让开发人员更加关注于业务代码和开发效率。
框架和库的区别?
框架(frame)是唯一的,库(lib)是可以共存的。
框架关注的是流程,库关注的是某一个功能。
Koa2的安装:
初始化: npm init -y
安装:npm install koa2 --save
安装简写:cnpm i koa2 -S
使用Koa2编写代码(感觉和http模块很像)
// 引入 koa
const Koa = require('koa');
// 实例化koa
const app = new Koa();
// 处理请求和响应 ctx => context 上下文
// use 是这里的中间件
app.use(ctx => {
ctx.body = '<h1>Hello World !</h1>'
})
app.listen(3000)
Koa2脚手架的全局安装:
npm install -g koa-generator 或者 cnpm i -g koa-generator
使用koa2创建项目:
// 使用koa2创建项目
koa2 项目名称
// 初始化安装依赖 进入项目文件夹中 输入
cnpm i //或 npm install
什么是路由?
决定不同的URL返回的结果是不同的
路由的在Koa2的本质就是“中间件”
路由的意义:
处理不同的URL
处理不同的HTTP方法
解析URL上面的参数
Koa中间件
Koa的中间件可以看成是一个 "洋葱模型"
// 引入 koa
const Koa = require('koa');
// 实例化koa
const app = new Koa();
// 处理请求和响应 ctx => context 上下文
// use 是这里的中间件
app.use(ctx => {
console.log(1);
ctx.body = '<h1>Hello World !</h1>' // 文件启动后,刷新页面只会显示1,不显示2
})
app.use(ctx => {
console.log(2);
})
app.listen(3000)
要想下一个中间件执行,则需要用到async和await
// 引入 koa
const Koa = require('koa');
// 实例化koa
const app = new Koa();
// 处理请求和响应 ctx => context 上下文
// use 是这里的中间件
app.use(async (ctx,next) => {
console.log(1);
await next()
console.log('1-1')
ctx.body = '<h1>Hello World !</h1>'
})
app.use(async (ctx,next) => {
console.log(2);
await next()
console.log('2-1')
})
app.use(ctx => {
console.log(3); //执行的结果为 1 2 3 2-1 1-1 实现异步执行
})
app.listen(3000)
使用koa-router实现路由(使用koa也可实现以下代码,使用koa中间件的ctx.url判断去实现路由访问的效果,使用ctx.method来判断访问的方法是什么方法,使用ctx.body渲染页面)
// 引入
const Koa = require('koa');
const Router = require('koa-router');
const app = new Koa();
const router = new Router({
prefix: '/user' //路由url的前缀 http://localhost:3000/user
})
router.get('/',async ctx => {
ctx.body = '这是用户首页'
})
router.get('/del',async ctx => {
ctx.body = '删除用户'
})
router.post('/add',async ctx => {
ctx.body = '添加用户'
})
// 使用中间件
app.use(router.routes())
// 监听的端口号
app.listen(3000)
REST是什么?
REST是万维网软件架构风格(可直接理解为 style风格)
REST(Representational State Transfer)数据表现形式 当前状态或数据 数据传输
REST的 6 个限制(重点哟)******
1、客户端-服务端(Client/Server)
关注点分离
服务端专注与数据存储,提升了简单性
前端专注于用户界面,提升了可移植性
2、无状态(Stateless)
所有用户会话信息都保存在客户端(服务端不用保存会话信息)
每次请求必须包含所有信息
不能依赖上下文信息
简单性、可靠性、可见性
3、缓存(Cache)
所有服务端响应都要被标为可缓存(比如css,js这些不长变得静态文件)或不可缓存(比如经常变的接口信息,数据)
减少前后端交互,提升性能
4、统一接口(Uniform Interface)**
接口设计尽可能统一通用
接口解耦,是前后端独立开发
5、分层系统(Layered System)
每层只知道相邻的一层
客户端不知道是和代理还是真实服务器通信
其他层:安全层、负载均衡、缓存层
6、按需代码(Code-On-Demand)(不是特别重要)
客户端可以下载运行服务端传来的代码
通过减少功能,简化客户端
RESTfull API简介
RESTful API具体什么样子?
基本的URI,如 https://api.github.com/users
标准的HTTP方法,如:GET、POST、DELETE、PUT等
传输的数据媒体类型,如:JSON、XML
RESTfull API 规范
1、请求设计规范
URI使用名词,尽可能使用复数,如/users
URI使用嵌套表示关联关系,如 /users/12/repos/5
使用正确的的请求方法,如GET、POST、PUT等
不符合CRUD的情况:POST/action/子资源
控制器
1、什么是控制器?
拿到路由分配的任务,并执行。(在koa中可以理解为控制器就是中间件)
2、为什么要使用控制器呢?
获取HTTP请求参数、处理业务逻辑。
获取HTTP请求的参数
获取GET请求中的URL中的参数 /xxx/xxx?wd=xxx;可使用
let {id} = ctx.request.query
// 或 let {id} = ctx.query
获取POST请求中的body中的参数,需要先安装koa-bodyparser这个中间件,然后引用
// 引入
const Koa = require('koa');
const Router = require('koa-router');
const bodyparser = require('koa-bodyparser')
const app = new Koa();
const router = new Router({
prefix: '/user' //路由url的前缀 http://localhost:3000/user
})
router.get('/',async ctx => {
ctx.body = '这是用户首页'
})
// 模拟获取query中的数据
router.get('/del',async ctx => {
// let {id} = ctx.request.query;
let {id} = ctx.query;
console.log(id);
ctx.body = '删除用户'
})
// 模拟获取 body中的数据
router.post('/add',async ctx => {
let {username,pwd} = ctx.request.body
console.log(username,pwd);
ctx.body = '添加用户'
})
// 使用中间件
app.use(bodyparser())
app.use(router.routes())
// 监听的端口号
app.listen(3000)
获取请求中的路由参数(http://127.0.0.1/user/find/:id)
// 引入
const Koa = require('koa');
const Router = require('koa-router');
const app = new Koa();
const router = new Router({
prefix: '/user' //路由url的前缀 http://localhost:3000/user
})
// 模拟获取 路由中的数据
router.get('/find/:id',async ctx => {
let {id} = ctx.params;
console.log(id);
ctx.body = '删除用户'
})
// 使用中间件
app.use(router.routes())
// 监听的端口号
app.listen(3000)
错误处理
什么是错误处理?
编程语言或计算机硬件中的一种机制;处理软件或信息系统中出现的一些异常状态。
异常状况有哪些?
在RESTful这种编写风格中是指:运行时错误500;逻辑错误:404未找到、412先决条件失败、422无法处理的实体。
为什么要错误处理?
防止程序挂掉、告诉用户错误信息、便于开发者调试。
Koa的错误处理机制
// 引入
const Koa = require('koa');
const bodyparser = require('koa-bodyparser');
const router = require('./routes/user')
const app = new Koa();
// 自己编写一个异常处理的中间件
app.use(async (ctx,next) => {
try {
await next(); // 如果没有错误,那么就执行洗一个
} catch (error) { // 抛出错误,就扑或异常
ctx.status = error.status;
ctx.body = {
message: error.message
}
}
})
app.use(bodyparser)
app.use(router.routes())
app.listen(3000)
在koa2中有一个错误处理机制的一个中间件——koa-json-error
// 下载 koa-json-error 模块处理koa服务中的一些异常
npm install koa-json-error --save //或 cnpm i koa-json-error --save
使用koa-json-error捕获异常
// 引入
const Koa = require('koa');
const bodyparser = require('koa-bodyparser');
const jsonError= require('koa-json-error');
const app = new Koa();
app.use(jsonError())
app.use(bodyparser)
app.use(router.routes())
app.listen(3000)
Koa2校验参数
controllers文件下的user.js文件
let userList = [{username: 'tom',pwd: '123'}]
// 添加用户
const add = async (ctx) => {
ctx.verifyParams({ //处理前的校验
username: {
type: 'string',
require: true
},
pwd: {
type: 'string',
require: true
},
})
let {username,pwd} = ctx.request.body
userList.push({
username,
pwd
})
ctx.body = {
code: 200,
msg: '添加成功'
}
}
// 修改用户
const update = async (ctx) => {
let user = ctx.request.body
userList.splice(Number(user.id),1,{
username: user.username,
pwd: user.pwd
})
ctx.body = {
code: 200,
msg: '修改成功'
}
}
// 删除用户
const deleteUser = async (ctx) => {
let {id} = ctx.request.body
userList.splice(Number(user.id),1)
ctx.body = {
code: 200,
msg: '删除成功'
}
}
// 查询用户
const find = async (ctx) => {
ctx.body = {
data: userList
}
}
// 查询单个用户
const findOne = async (ctx) => {
let {id} = ctx.params.id
ctx.body = {
code: 200,
user: userList[Number(id)]
}
}
module.exports = {
add,
update,
deleteUser,
find,
findOne
}
app.js中的使用koa-parameter校验中间件
// 引入
const Koa = require('koa');
const jsonError= require('koa-json-error');
const bodyparser = require('koa-bodyparser');
const parameter = require('koa-parameter'); //校验
const router = require('./routes/user')
const app = new Koa();
app.use(jsonError)
app.use(bodyparser)
app.use(parameter) //校验要在post提交之后进行
app.use(router.routes())
app.listen(3000)