koa中如何优雅地处理异常和错误
⼀
异常和错误的抛出
1、常见抛出异常和错误类型:
●代码语法不规范造成的JS报错异常
●程序运⾏中发⽣的⼀些未知异常
● HTTP错误
●⾃定义的业务逻辑错误
2、不优雅的⽅式
koa框架提供了ctx.throw(400)的⽅式,可以让我们⽅便地抛出http错误,但是如果你想同时返回⼀些有⽤信息怎么办?也许你会这么做:
ctx.status = 400
ctx.body = {
msg: "参数错误"
}
若需要定义若⼲业务逻辑错误码和说明,返回不同的code,在controller层⾯,你也许可以这样处理:
<('/', (ctx, next) => {
if (tokenExpire(token)) {
const errcode = ERROR_CODE.TOKEN_EXPIRED
ctx.body = {
errcode,
msg: ERROR_MSG[errcode]
}
return
}
// do something
})
如果是在model层或者server层,要处理这样的错误怎么办?
如果是在model层或者server层,要处理这样的错误怎么办?
通过定义返回值来说明错误,在controller中判断返回值再返回相应错误码,⽐如:('/', (ctx, next) => {
if (tokenExpire(token)) {
const errcode = ERROR_CODE.TOKEN_EXPIRED
ctx.body = {
errcode,
msg: ERROR_MSG[errcode]
}
return
}
// do something
})
抛出Error,在controller中catch住异常,并对⽐ssage来返回相应错误码,⽐如:const somefunc = async (token) => {
const res = await tokenExpire(token)
if (res) {
throw Error(ERROR_MSG.TOKEN_EXPIRED)
}
// do something
}
⼆
异常的捕获
1、error事件的监听⽅式:unknown怎么处理
const Koa = require('koa')
const app = new Koa()
<('error', (err, next) => {
<('server error',err) })
const main = ctx => {
ctx.throw(500)
}
app.use(main)
app.listen(3000)
2、重载t.⽅法的⽅式:const Koa = require('koa')
const app = new Koa()
const main = ctx => {
ctx.throw(500)
}
app.use(main)
app.listen(3000)
3、中间件的处理⽅式:
const Koa = require('koa')
const app = new Koa()
app.use( async (ctx, next) =>{ await next().catch(error => { console.log(error)
});
})
const main = ctx => {
ctx.throw(500)
}
app.use(main)
app.listen(3000)
三
更优雅的⽅式
⽬标:我们希望⽆论在哪⾥,直接⼀⾏代码就可以抛出错误,并被正确处理,返回相应的错误码和信息。⽅案:⾃定义的继承于Error构造器的⽅法,利⽤koa中间件catch住错误,并统⼀把返回值做处理。
1、定义继承于Error构造器的⽅法CustomError
function CustomError(code, msg) {
Error.call(this, '');
if (arguments.length === 1 && typeof arguments[0] == 'string') {
msg = arguments[0];
code = 300;
}
this.msg = msg || ERROR_MSG[code] || '发⽣了⼀个致命错误!';
return { code: de, msg: this.msg }
}
}
util.inherits(CustomError, Error);// 对象原型继承
2、抛出错误
const somefunc = async (token) => {
const res = await tokenExpire(token)
if (res) {
throw new CustomError(CUSTOM_CODE.SOME_CUSTOM_ERROR)
throw new CustomError(CUSTOM_CODE.SOME_CUSTOM_ERROR) }
// do something
}
3、koa中间件统⼀catch住Error,并返回相应code,msg
app.use((ctx, next) => {
return next().catch((err) => {
let code = 500
let msg = 'unknown error'
if (err instanceof CustomError || err instanceof HttpError) {
const res = CodeMsg()
ctx.status = err instanceof HttpError ? de : 200
code = de
msg = res.msg
} else {
<('err', err)
}
ctx.body = { code, msg }
})
})
四
koa-的介绍
1、koa-的使⽤
npm install koa-
const fs = require('fs');
const koa = require('koa');
const = require('koa-');
const app = new koa();
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论