请注意,笔记分为7个md文件。这个是第0个,还有其他的分别是 1-6开头的
轻量级【没有挂载任何中间件】
web框架
服务于web应用和api开发
,更加优雅 编写服务端的应用程序
koa四部曲
// 一. 导入koa
const Koa = require('koa')
// 二. 实例化对象
const app = new Koa()
// 三. 编写中间件
app.use((ctx) => {
ctx.body = 'hello Koa2'
})
// 四. 启动服务
app.listen(3000, () => {
console.log('server is running on http://localhost:3000')
})
ctx就是请求上下文,
ctx.body = '1111' 返回给客户端信息
ctx.state.user = ''用来传递存储信息
ctx.response 返回响应信息
ctx.request 返回请求信息
注意:
- app.use()返回的是this本身,所以能够链式调用 app.use().use()
- app.use()里面只能够接受一个函数
- npx nodemon -v 的工作原理。先看node_modules里面有没有这个包,没有 再去全局找,再没有 就去安装最新的版本
就是函数
介于请求和响应之间
的函数
为什么要拆分?拆分后,每个中间件的功能更加单一。为了复用
类似流水线工人
一个人做一个产品的一部分,再交给下一个工人。
// 1. 导入koa包
const Koa = require('koa')
// 2. 实例化对象
const app = new Koa()
// 3. 编写中间件
app.use((ctx, next) => {
console.log(1)
next()
console.log(2)
console.log('---------------')
ctx.body = 'hello world'
})
app.use((ctx, next) => {
console.log(3)
next()
console.log(4)
})
app.use((ctx)=>{
console.log(5)
})
// 4. 监听端口, 启动服务
app.listen(3000)
console.log('server is running on http://localhost:3000')
打印 1 3 5 4 2
中间件1 执行 -》碰到next -》执行下一个中间件2 -》碰到next -》执行下一个中间件3 -》中间件3执行好了 -》回到中间件2 -》回到中间件1
就像上面那样,从洋葱外部进入到洋葱里面,再从洋葱里面出来,就是洋葱圈模型
// 1. 导入koa包
const Koa = require('koa')
// 2. 实例化对象
const app = new Koa()
// 3. 编写中间件
app.use((ctx, next) => {
ctx.message = 'aa'
next()
ctx.body = ctx.message
})
app.use((ctx, next) => {
ctx.message += 'bb'
next()
console.log(4)
})
app.use((ctx)=>{
const res = new Promise((resolve, reject) => {
resolve('cc')
})
ctx.message =+res
})
// 4. 监听端口, 启动服务
app.listen(3000)
console.log('server is running on http://localhost:3000')
ctx.body 输出后,没有包含promise对象的值,因为这个是异步的,会跳出洋葱圈的模型,因此需要async + await的帮助
// 1. 导入koa包
const Koa = require('koa')
// 2. 实例化对象
const app = new Koa()
// 3. 编写中间件
app.use(async (ctx, next) => {
ctx.message = 'aa'
await next()
ctx.body = ctx.message
})
app.use(async (ctx, next) => {
ctx.message += 'bb'
await next()
console.log(4)
})
app.use(async (ctx)=>{
const res = await new Promise((resolve, reject) => {
resolve('cc')
})
ctx.message =+res
})
// 4. 监听端口, 启动服务
app.listen(3000)
console.log('server is running on http://localhost:3000')
上面就能够输出 aabbcc
next返回的也是promise的值
koa最原始的路由方式,ctx.request.url 与 ctx.request.method
返回值用 ctx.body = ''
koa-router就是这个原理
// 一. 导入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')
})
/:id
通过 ctx.request.params
/find?name="123"&&age="345"
通过 ctx.request.query
通过ctx.request.body获得 请求体里面的信息
学会查看postman的报错,404,还是500?
koa默认不支持post参数的解析
需要koa-body社区的中间件来支持,必须放在所有的路由之前使用
koa可以通过 ctx.throw(404)
手动抛出
ctx.throw(400);
ctx.throw(400, 'name required');
ctx.throw(400, 'name required', { user: user });
500:如果是代码执行错误,node终端解析不会出问题,但是发请求 会返回500。随便加一个a.b
404:笼统的说法,资源没有找到。传参传错,路由没有匹配上;没有写ctx.body返回值
能够帮助我们返回错误信息,但是和emit on 发布订阅的方式二者只能取其一
下包:
koa-json-error 帮助自动检索错误
cross-env 帮助我们在package.json里面配置环境变量
package.json
"scripts": {
"dev": "nodemon src/08_错误处理.js",
"prod": "cross-env NODE_ENV=production node src/08_错误处理.js"
},
服务器文件
const error = require('koa-json-error')
app.use(
error({
format: (err) => {
return { code: err.status, message: err.message, result: err.stack }
},
postFormat: (err, obj) => {
// 能够将result和rest变量区分开来
const { result, ...rest } = obj
return process.env.NODE_ENV == 'production' ? rest : obj
},
})
)
路由文件
router.get('/article/:id', (ctx) => {
console.log(ctx.params)
// 没有通过ctx.body返回数据时, 默认koa返回404错误
// console.log(aaa)
if (false) {
ctx.body = { id: 1, title: '文章1', content: '文章1' }
} else {
ctx.throw(422, '参数格式不正确')
}
})
通过ctx.throw手动抛出错误
或者是aaa没有定义变量,返回500的错误
或者是查不到id值,返回404错误,都可以被捕获到