路由
在 Koa 中,路由是用来定义和处理特定 URL 路径和 HTTP 方法的请求。虽然 Koa 本身不包含路由功能,但可以使用第三方中间件如 koa-router
来实现强大的路由功能。
使用koa-router
(1)安装
npm i koa-router
(2)注册
// 导入
const Router = require('@koa/router');
// 创建路由器
const router = new Router()
// 注册
app.use(router.routes()).use(router.allowedMethods())
2
3
4
5
6
(3)使用
router.get('/', (ctx) => {
ctx.body = 'Hello, Koa!';
})
2
3
请求参数解析
在后端开发中,解析请求参数是进行数据库操作等业务逻辑处理的重要步骤。不同的HTTP请求方法在传递参数时有不同的方式,
GET
:GET请求通过URL传递参数,参数以键值对的形式存在于查询字符串中,例如:GET /users?id=123&name=John
POST
/PUT
/PATCH
/DELETE
:这些请求方法通常通过请求体(body)传递参数。请求体可以采用多种格式,如JSON、表单数据等。 在 Koa 中,解析请求参数可以通过不同的方式来处理,这取决于参数的来源。请求参数主要有三种类型:查询字符串参数、路由参数和请求体参数。
1 查询字符串
查询字符串参数是通过 URL 中的查询字符串传递的,通常位于 URL 的 ?
之后。在 Koa 中,可以通过 ctx.query
或 ctx.querystring
来访问这些参数。 假设请求 URL 是 http://localhost:3000?name=dancy
,你可以这样获取参数:
router.get("/", (ctx) => {
// ctx.query 是 ctx.request.query 的代理
const { name } = ctx.query
ctx.body = `Hello ${name}`
})
2
3
4
5
2 路由参数
路由参数是通过 URL 的路径部分传递的,通常在定义路由时使用占位符来捕获。在 Koa 中,路由参数通常需要使用路由中间件(如 koa-router
)来实现。 假设请求 URL 是 http://localhost:3000/users/123
,你可以这样获取参数:
router.get('/users/:id', (ctx)=>{
const { id } = ctx.params
ctx.body = `id ${id}`
})
2
3
4
3 请求体参数
请求体参数是通过 HTTP 请求体传递的,通常在 POST、PUT 等请求中使用。在 Koa 中,处理请求体(body)参数需要使用中间件来解析请求体的数据,因为 Koa 本身不包含对请求体的解析功能。官方推荐的中间件有:koa-bodyparser
、koa-body
koa-bodyparser
koa-bodyparser
是一个用于解析 HTTP 请求体的中间件,专门用于处理 JSON 和 URL-encoded 格式的数据。在 Koa 应用中,它是处理请求体的常用选择,尤其适合不涉及文件上传的场景。
npm install koa-bodyparser
(2)注册
// 导入
const bodyParser = require('koa-bodyparser');
// 在所有路由处理之前注册 bodyParser 中间件,解析请求体中的参数,挂载到ctx.request.body
app.use(bodyParser());
2
3
4
(3)使用 通过 ctx.request.body
获取请求体参数
router.post("/", (ctx) => {
const { name } = ctx.request.body
ctx.body = `Hello ${name}`
})
2
3
4
koa-body
koa-body
是一个用于解析 HTTP 请求体的中间件,功能比koa-bodyparser
更加丰富。它不仅可以处理 JSON 和 URL-encoded 的请求体,还支持文件上传、多部分表单数据等。包地址:https://www.npmjs.com/package/koa-body (1)安装
npm install koa-body
(2)注册
// 导入
const { koaBody } = require('koa-body');
// 在所有路由处理之前注册 koaBody 中间件,解析请求体中的参数,挂载到ctx.request.body
app.use(koaBody());
2
3
4
(3)使用 通过 ctx.request.body
获取请求体中的数据
router.post("/", (ctx) => {
const { name } = ctx.request.body
ctx.body = `Hello ${name}`
})
2
3
4
错误处理
错误处理是接口编程中不可或缺的一部分,通过提供更友好的错误提示,可以有效提升开发效率和系统的稳定性。 Koa 提供了一些内置的机制来处理同步和异步错误,使得开发者可以轻松地捕获和处理应用中的异常。
1 原生的错误处理
在 Koa 中,错误处理通常可以分为三类:404 错误、手动抛出的错误和运行时错误(500 错误)。
- 404错误:当请求的资源找不到,或者没有通过
ctx.body
返回响应时,Koa 会自动返回 404 错误。 - 手动抛出的错误:开发者可以通过
ctx.throw(statusCode, errorMessage)
方法手动抛出错误,这种方式通常用于在业务逻辑中检测到错误条件时抛出相应的 HTTP 错误。 - 运行时错误:代码中的未捕获异常或逻辑错误导致的服务器端错误 **Koa 是基于 Node.js 的事件模型实现的,其核心类继承自
node:events
的EventEmitter
类。**这使得 Koa 可以通过事件机制来处理错误: - 通过 emit 提交一个错误
ctx.app.emit('error', {
code: 404,
message: '资源不存在'
}, ctx)
2
3
4
- 通过 on 进行统一错误处理 只能处理 emit 提交的错误
app.on('error', (err, ctx)=>{
console.error(err)
ctx.body = err
})
2
3
4
ctx.throw 和 throw的区别
ctx.throw
是 Koa 提供的一个方法,用于抛出 HTTP 错误。它的主要作用是抛出带有特定 HTTP 状态码的错误,并自动设置响应状态码和错误信息。- 普通的
throw
是 JavaScript 中用于抛出异常的语法。它可以抛出任何类型的异常(如字符串、对象、实例等),但不会自动设置 HTTP 状态码。
2 使用中间件
koa-json-error
是一个用于处理 Koa 应用中错误并返回 JSON 格式错误响应的中间件。它提供了一种简单而有效的方式来捕获和处理错误,并以一致的 JSON 格式返回错误信息,适用于构建 API 服务。 (1)安装
npm i koa-json-error
(2)注册
// 导入
const jsonError = require('koa-json-error');
// 注册
app.use(jsonError());
2
3
4
// 自定义错误处理函数
const errorHandler = (err, ctx) => {
return {
message: err.message,
// 在开发环境中返回详细的错误堆栈信息
stack: process.env.NODE_ENV === 'development' ? err.stack : undefined,
status: err.status || 500,
};
};
// 使用自定义错误处理函数的 koa-json-error 中间件
app.use(jsonError(errorHandler));
2
3
4
5
6
7
8
9
10
11
(3)使用
app.use(async ctx => {
if (ctx.path === '/error') {
throw new Error('This is an intentional error.');
}
ctx.body = 'Hello, Koa!';
});
2
3
4
5
6