专栏首页mySoul优雅 | 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

这样就完成了一次的改写。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ejs koa

    npm https://www.npmjs.com/package/koa-static

    mySoul
  • 知新 | koa框架入门到熟练第一章

    是由Express原班人马打造,致力于成为一个更小的,更加富有表现力的,web框架。

    mySoul
  • 学习 | egg.js 中间件和插件

    [wp_editor_md_7ee9bb85a07c7f001ca0a8ed9432368c.jpg]

    mySoul
  • 如何学习Java

    不要被什么科班出身之类的说法吓坏了。虽然我是科班出身,但我始终觉得,只要你肯努力,这里面并没有什么无法逾越的鸿沟,最重要的是不要好高骛远,也不要急于求成。学习和...

    海纳
  • 如何自己实现一个简单的webpack构建工具 【精读】

    webpack可以说是目前最火的打包工具,如果用不好他,真的不敢说自己是个合格的前端工程师

    Peter谭金杰
  • 一文入门网络爬虫WebMagic(附演示代码)

    hello,你们的墨白回来了,从这周开始,不出意外我会坚持两天一更新,关注我时间较久的小伙伴都知道,最近这段时间墨白在求职,上周才找到一家满意的新公司,...

    框架师
  • 干货|优化算法在菜鸟网络中的应用

    作者: 本华 菜鸟网络-人...

    fishexpert
  • 搜索中的权重度量利器: TF-IDF和BM25

    我们在网上搜东西时,搜索引擎总是会把相关性高的内容显示在前面,相关性低的内容显示在后面。那么,搜索引擎是如何计算关键字和内容的相关性呢?这里介绍2种重要的权重度...

    Stanley Sun
  • 艾伦·图灵传

    本书是公认的图灵最权威传记。艾伦·图灵是现代计算机科学之父,在24岁时奠定了计算机的理论基础。二战期间,他为盟军破译密码,为结束战争做出巨大贡献。战后,他开创性...

    用户3157710
  • Redis分片机制

    前两篇文章对Redis主从复制和主从切换的知识点进行了介绍,但是也很明显的有一点小弊端:

    逆月翎

扫码关注云+社区

领取腾讯云代金券