异常处理的重要性
异常处理是我们后端开发人员必须重视的一个东西,这样返回的信息可以让我们明确异常在哪里,可以给前台一个友好的提示。当我们遇到错误,我们会通过异常抛出的信息,来解决问题。
如何抛出异常
我们知道,如果是服务器错误的时候,会自动抛出异常500,这是服务器的默认处理,无论出现什么错误都会抛出同一个错误信息,如何我们主动抛出错误呢。
try{ dosomething throw error('error') } catch(error){ console.log('报错了') }
在koa全局捕获错误
我们把整个捕获异常放在中间件里面,这样每一个错误都可以被捕获到。
在middlewares下面建立一个catcherror中间件
const CatchHttp = require('../utils/catchInit') const catchError = async (ctx, next) => { try { await next(); } catch (error) { console.log(error) if (error instanceof CatchHttp) { ctx.body = { code: error.code, message: error.message } ctx.status = error.status; } } } module.exports = catchError
这样我们就通过监听next(),如果下一个中间间出现错误我们就可以捕获到错误,我们可以在我们知道哪里可能出现错误,主动抛出一个错误,设置错误的errorCode类型,然后根据errorCode来判断错误类型。
const Koa = require('koa'); const app = new Koa(); const Router = require('koa-router'); const parser = require('koa-bodyparser'); const InitManager = require('./utils/init') const catchError = require('./middlewares/catchError') //一定要放在第一个中间件 app.use(catchError) app.use(parser()) InitManager.init(app); app.listen(3000);
例如book.js
const Router = require('koa-router'); const router = new Router(); router.get('/v1/book/lates/:id', async (ctx, next) => { const params = ctx.params; if (true) { //这里将捕获错误的类给到了全局,代码在下面 const error = new global.errs(404, '测试', 400) throw error; } ctx.body = { code: params } }) module.exports = router
封装错误信息
新建catchInit.js
class CatchHttp extends Error { constructor(code = 400, message = '服务器异常', status) { super() this.code = code this.message = message; this.status = status; } } module.exports = CatchHttp
这样封装了错误码和全局处理信息,但是每次都需要手动引入CatchHttp函数,比较麻烦,处理办法将CatchHttp给到全局对象Global
const RequireDirectory = require('require-directory'); const Router = require('koa-router'); class InitManager { static init(app) { InitManager.app = app; InitManager.initLoadRouter() InitManager.loadError(); } static initLoadRouter() { //path const apiPath = `${process.cwd()}/app/api`; const modules = RequireDirectory(module, apiPath, { visit: loadModules }); function loadModules(obj) { if (obj instanceof Router) { InitManager.app.use(obj.routes()).use(obj.allowedMethods()) } } } //加载异常处理,抛出全局的异常处理 static loadError() { const errors = require('../utils/catchInit') global.errs = errors; } } module.exports = InitManager
发表评论
侧栏公告
寄语
譬如朝露博客是一个分享前端知识的网站,联系方式11523518。
热评文章
标签列表
热门文章
友情链接