优雅 | koa处理异常
时间:2022-07-22
本文章向大家介绍优雅 | koa处理异常,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一个良好的编码习惯必然离不开异常处理,本文将会介绍如何在koa框架下面如何抛出错误,并统一处理返回异常。
正常错误处理
koa是一个优秀的NodeJs web框架,在我们开发web项目的时候,避免不了任何错误处理,包括http错误以及自定义的业务逻辑处理。
在Node.js 中,抛出错误如下
if(someCondition){
throw Error("Error");
}
Http错误处理
这里使用ctx.throw(400)的方式,抛出http错误,同时返回一些信息。
ctx.status = 400
ctx.body = {
msg: "some params is invalid"
}
此时既返回了状态码,又返回了相关的错误信息。
业务逻辑错误处理
如果需要开发Restful API server,这个时候需要定义若干的业务逻辑错误代码,像下面这样的
code码 |
说明 |
---|---|
0 |
success |
-1 |
server error |
4001 |
token 过期 |
这个时候,就需要在业务层中进行处理。
router.get("/", (ctx, next) => {
if(tokenExpire(token)){
const errcode = ERROR_CODE.TOKEN_EXPIRED;
ctx.body = {
errcode,
msg: ERROR_MSG[errcode]
}
return
}
})
这里,就返回了相关的errcode,通过errcode的方式返回了相关的错误代码
全局捕获异常处理
这里在koa里,全局捕获异常,这里使用中间件的方式,确保异常可以捕获到
在middlewares建立一个catcherror中间件,达到捕获到异常的方式
// middlewares/catcherror.js
const catchError = async(ctx, next) => {
try{
await next();
}catch(error){
if(error.errorCode){
console.log("捕获到异常")
return ctx.body = errror.msg;
}
}
}
module.exports = catchError
这样定义一个中间件,在中间件进行相关的捕获,确保捕获到相关的异常,并把这个中间件进行导出。
放在next里面,如果next程序出现异常,就可以实现在中间件进行相关的捕获。
const koa = require("koa")
const Router = require("router")
const app = new koa();
const router = new Router();
const catchError = require("./middlewares/catcherror")
app.use(catchError)
router.get('/login', (ctx, next) => {
const path = ctx.request.query;
// 主动抛出错误
if(true){
const error = new Error();
error.errorCode = 1000;
error.msg = "错误";
throw error
}
})
app.use(router.routers())
app.listen(3000)
这个时候,凭借着中间件,可以实现抛出错误异常。
使用基类的方式处理
主动抛出错误,会显示的相当麻烦,这里使用面向对象的方式,继承error类。
把错误信息,放入到error类中,通过放入error类中,实现对错误的直接抛出。
// core/http-exception.js
class HttpException extends Error{
constructor(msg = '服务器异常', errorCode = 1000. code = 400){
super();
this.msg = msg;
this.code = code;
this.errorCode = errorCode;
}
}
module.export = HttpException
再次改写app.js
// app.js
const koa = require('koa')
const Router = require('router')
const app = new koa()
const router = new Router()
const {HttpException} = require('../core/http-exception')
const catchError = require('./middlewares/catcherror')
app.use(catchError) //一定要放在第一个中间件
router.get('/login',(ctx,next)=>{
const path = ctx.request.query
// 我们主动抛出一个错误
if(true){
// 主要改写这里,创建新的异常
const error = new HttpException('登录错误',10000,500)
throw error
}
})
app.use(router.routes())
app.listen(3000)
再次改写中间件,判断异常是否属于此异常的对象
// middlewares/catcherror.js
const {HttpException} = require('../core/http-exception')
const catchEoore = async (ctx,next)=>{
try{
await next()
} catch(error){
if(error instanceof HttpExcetion){
return ctx.body = error.msg
}
}
}
}
module.exports = catchError
这样就完成了一次的改写。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Laravel框架Auth用户认证操作实例分析
- yii2实现Ueditor百度编辑器的示例代码
- PHP下载文件函数与用法示例
- php实现银联商务公众号+服务窗支付的示例代码
- php使用json-schema模块实现json校验示例
- 17个品牌,113款5G手机,5G离我们越来越近。
- PHP的cookie与session原理及用法详解
- Thinkphp5.0框架视图view的循环标签用法示例
- Thinkphp5.0 框架视图view的比较标签用法分析
- laravel 操作数据库常用函数的返回值方法
- laravel 验证错误信息到 blade模板的方法
- thinkPHP+LayUI 流加载实现功能
- Thinkphp5.0框架使用模型Model的获取器、修改器、软删除数据操作示例
- laravel5.2表单验证,并显示错误信息的实例
- ThinkPHP 5.1 跨域配置方法