koa2异常处理_关于koa:优雅-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

这样就实现了一次的改写。

微信公众号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值