HTTP错误
访问 Web 服务器或应用程序时,服务器收到的每个 HTTP 请求都会以 HTTP 状态代码进行响应。
HTTP 状态代码是三位数代码,分为五个不同的类别。
状态代码的类别可以通过它的第一个数字快速识别:
- 1xx:信息
- 2xx:成功
- 3xx:重定向
- 4xx:客户端错误
- 5xx:服务器错误
本章节侧重于从系统管理员的角度识别和排除最常见的 HTTP错误 代码,即 4xx 和 5xx 状态代码。
更多精彩内容,请微信搜索“前端爱好者
“, 戳我 查看 。
客户端和服务器错误概述
客户端错误:或从 400 到 499 的 HTTP 状态代码是用户客户端(即 Web 浏览器或其他 HTTP 客户端)发送 HTTP 请求的结果。
尽管这些类型的错误与客户端相关,但了解用户遇到的错误代码对于确定潜在问题是否可以通过服务器配置修复通常很有用。
服务器错误 :或从 500 到 599 的 HTTP 状态代码,当 Web 服务器知道发生了错误或无法处理请求时,它会返回。
错误处理
什么是错误处理
- 编程语言或计算机硬件里的一种机制
- 处理软件或信息系统中出现的异常状况
异常状况有哪些?
- 运行时错误,返回500
逻辑错误
- 404 找不到
- 412 先决条件失败
- 422 无法处理的实体
为什么要用错误处理?
- 防止程序挂掉
- 告诉用户错误信息
- 便于开发者调试
Koa中错误处理
使用koa自带错误机制处理错误
koa中,通过ctx.throw( 状态码)来抛出异常, 也可以携带自己想提示错误信息
//这里我们限制输入的id不能为负数,否则就抛出错误
usersRouter.get('/:id', (ctx) => {
if(ctx.params.id * 1 < 0 ) {
ctx.throw(404, '这个用户太小了, 找不到')
}
ctx.body = db[ctx.params.id * 1]
})
自己编写错误处理中间件
从上图我们可以看出, 返回的状态码为404, 错误处理信息也显示了。
Koa默认的错误处理有个缺点:返回的是以文本形式的错误信息。在Restful API的最佳实践中, 要求使用JSON格式返回信息。
如果我们想要JSON格式的错误信息,我们可以自己编写一个错误处理中间件,放在执行顺序的最前面, 来对后面执行的代码进行错误处理,并且返回JSON格式的错误信息。
所以我们可以自己写一个中间件, 放在执行顺序的最前面, 来对后面执行的代码进行错误处理
//错误处理中间件
app.use(async (ctx, next) => {
try {
await next()
} catch (error) {
ctx.status = error.status || error.statusCode || 500
ctx.body = {
message: error.message
}
}
})
再次使用上例测试,则显示如下结果:
可以看到, 错误信息就以Json的格式显示出来了
完整代码
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 (err) {
ctx.status = err.status || err.statusCode || 500
ctx.body = {
message: err.message
}
}
})
app.use(bodyparser())
app.use(router.routes())
app.listen(3000)
使用错误处理中间件koa-json-error
进行错误处理
koa-json-error是一款比较优秀的错误处理中间件,这个中间件是专门为纯JSON的应用准备的,非常符合RESTful API。
它还有许多丰富的功能,比如:
- 返回错误堆栈信息到客户端,方便开发调试使用;
- 还可以配置错误信息,哪条错误信息不想返回到客户端时,可以选择禁用;
- 还可以让400错误和404错误也返回JSON。
安装koa-json-error
npm install koa-json-error --save
使用koa-json-error的默认配置处理错误
const koa = require('koa')
const bodyparser = require('koa-bodyparser')
const jsonerror = require('koa-json-error')
const router = require('./routes/user')
const app = new koa()
// 使用 koa-json-error中间件
app.use(jsonerror())
app.use(bodyparser())
app.use(router.routes())
app.listen(3000)
展示结果
参考文档:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。