优雅 | 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

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

目录
相关文章
|
Kubernetes 容器 Perl
【kubernetes】如何找到k8s内部拉取的镜像
【kubernetes】如何找到k8s内部拉取的镜像
889 1
|
安全
静态IP代理的最佳实践如何选择合适的方法
在信息化时代,网络成为生活的重要部分,为保护个人信息安全,使用静态IP代理变得越来越普遍。本文介绍了五种实现静态IP代理的方法:租用服务、自建服务器、云服务、ISP提供及转发代理,帮助用户根据需求选择最合适的方式。
498 2
|
Prometheus 监控 Cloud Native
Prometheus中的Exporter详解
【10月更文挑战第25天】Prometheus Exporter分为直接采集(如cAdvisor, Kubernetes)和间接采集(如Node Exporter)两类。
|
机器学习/深度学习 自然语言处理 计算机视觉
探索深度学习中的Transformer架构
探索深度学习中的Transformer架构
274 2
|
网络协议 Windows
【常用命令】netstat -ano命令图文详细说明
【常用命令】netstat -ano命令图文详细说明
1311 0
|
搜索推荐 关系型数据库 MySQL
不引入ES,如何利用MySQL实现模糊匹配?
【8月更文挑战第23天】在数据处理和查询优化的日常工作中,我们常常面临需要执行模糊匹配的场景,比如搜索用户姓名、商品标题等。虽然Elasticsearch(ES)等搜索引擎提供了高效且强大的文本搜索能力,但在某些轻量级或资源受限的环境中,直接利用MySQL数据库实现模糊匹配也是一个经济且可行的选择。下面,我将分享几种在MySQL中实现模糊匹配的技术方法。
722 0
|
JavaScript 前端开发 机器人
Github 2024-06-17 开源项目周报 Top15
根据Github Trendings的统计,本周(2024年6月17日)共有15个项目上榜。按开发语言分类,Python项目最多,达6项;TypeScript和JavaScript各有3项;PHP、Blade、Lua、Dart及非开发语言项目各1项。这些项目涵盖从零构建技术、智能家居、高性能数据库到情感语音模型等多个领域,体现了开源社区的多样性和创新力。
522 0
|
分布式计算 Hadoop 数据安全/隐私保护
现成Hadoop安装和配置,图文手把手交你
现成Hadoop安装和配置,图文手把手交你
|
前端开发 测试技术 关系型数据库
异常测试实践与梳理
异常测试,是指通过人为制造异常,检测系统的处理是否符合逻辑。结合在A项目中的实践,梳理一下常见异常测试的类型、关注点及常用测试工具等。
7830 0
|
jenkins Java 应用服务中间件
使用Jenkins持续集成前端项目并自动化部署到Nginx服务器
上午折腾了一下Jenkins持续集成,由于公司使用自己搭建的svn服务器来进行代码管理,因此这里Jenkins是针对svn服务器来进行的配置,后面稍微介绍了下针对Github管理的项目的Jenkins配置 之前项目每次修改之后都需要本地npm run build一次手动发布到服务器上方便测试和产品查看,有了Jenkins持续集成之后只要svn或者git提交之后就会自动打包,很方便,此次记录以备后询。 声明: 后面的项目地址与打包地址都是使用em-mes,自行修改; 另外还有路径等,根据自己情况自行修改; 感兴趣的同学可以加文末的微信群,一起讨论吧~
使用Jenkins持续集成前端项目并自动化部署到Nginx服务器

热门文章

最新文章