对 koa 下错误处理的一点思考

2016/11/05 | 3分钟阅读 | 更新于 2016/11/05

在给自己写个独立的博客,以获取更高的自由度。最近正在尝试 koa,然后关于如何优雅地处理异常纠结了很久。目前我的代码结构是

config.js
part.tool.js
part.db.post.js
part.db.user.js
server.js
package.json
node_modules/

config.js 存放各种配置项目 server.js 作为入口 part.tool.js 提供一些工具类方法,比如返回数据的包装,错误信息的包装等 part.db..js 提供后端逻辑,包括数据验证和存储,在 server.js 调用相关方法传入原始数据 目前在 part.sb..js 中进行数据验证和处理,如果出错,调用 part.tool.js 提供的一个方法处理后 throw,在 server.js catch 处理好的错误信息直接返回。 起初我在纠结如何建立比较完善的错误码系统,要给前端一个明确的错误状态,同时将错误信息存储为日志。主要考虑两点:一点是可扩展,因为很多错误类型我暂时每月考虑到,但是之后可能会出现;然后另一点是简单明确,因为我需要在 part.db.*.js 中简单优雅地抛出一系列错误。期间参考了大家分享的设计方法,包括扩展 http 返回码,或者按严重程度和功能分类等等。 之后我在代码中试着实现其中的一些方案,不过发现不是很满足预期,与此同时我意识到一些问题。 如果一个用户要登录,数据传到这边,逻辑上应该怎么判断(如果是邮箱和密码登录,密码是HASH)?我的逻辑如下: –> 判断邮箱存在,空的话抛错(参数缺失,邮箱缺失); –> 判断邮箱格式,不符合抛错(参数错误,邮箱错误); –> 判断密码存在,不存在抛错(参数缺失,密码缺失); –> 判断密码强度,不符合要求抛错(参数错误,密码长度错误); –> 查找邮箱密码组合,找不到抛错(登录失败),找到不止一个组合,抛错(数据库错误,用户重复) –> 返回用户名,uid等 出于强迫症或者个人习惯,我把错误分的很细,希望设计一套完善的错误码系统的话前端就能明确的判断错误出在哪里。哪怕有些错误不会出现 …… 等等,有些错误不会发生!?对啊,我肯定会给前端进行各种验证,就像我对后端进行各种细致的验证,只有格式符合要求才会允许提交,理论上后端收到的密码肯定是HASH,正常也几乎不会出现数据重复这样的情况。 那错误码返回给谁呢 … 我自己开发的话,判断接口出错的原因的话console还有代码更直接。而错误码是为了给用户更好的体验,明确的告诉他到底因为什么导致操作失败,如果从浏览器里走的话(我觉得)不至于出现那么多莫名其妙的错误。如果有人绕过了浏览器,那就不是我要考虑的范围了,同时我更没必要透露更多的返回信息。 于是我的错误码就砍掉了,只拿 0 表示正常返回,1 表示出错,msg 指示信息。在操作中抛错的格式为 user.login.params.email_lost 这样的一个字符串,错误处理函数很简单就能知道是哪个模块,什么功能,什么类型错误,对于 db,auth 这种类型可以分配个高等级,对于 params 分配个低等级这样,接口返回的 msg 就只是简单的参数错误,用户不存在,需要登录等等。 目前(2016年11月5日20:23:59)而言,我是这样考虑的,不知道过一小时我是不是又有别的想法了。

更一条(2016年11月5日21:04:22),前面是在函数中判断好后再抛出错误,catch 中直接返回了处理好的err。但是这导致了,有一些其他的错误,比如函数未定义,这种 catch 的 err 返回给前端为 {},同时又不会在console 中输出 …

© 2026 香蕉引擎故障报告

🌱 Powered by Hugo with theme Dream.

关于

要怎么介绍自己呢,🤔。

很早以前是作为 Web 前端在学习的,但是工作第一年就成为了全干工程师。喜欢尝试各种东西,什么都会一点。

一直很喜欢 Ebiten 游戏引擎 ,特别简洁,用它做过一些小东西,可以查看这个分类 。另外特别推荐这个木鱼 ,是一个相对完整的小玩意儿,包含手搓的一个简单的 UI 框架;支持鼠标和键盘操作;有多语言和主题切换功能;同时支持 Web 端和客户端。它的源代码在 bin16/wooden-fish

主题

网站基于 Hugo,当前使用的是 hugo-theme-dream 主题的修改版 ,根据我的需要,做了一些对 PaperMod 的兼容。

我自己也写过主题 ,但是没有别人写的好看。

正在从我的笔记中往外搬运内容

等待更新:

  • 从《锈湖》中学了些什么东西
  • 我拿 React 写解谜游戏的经过
  • 基于 Pocketbase 的 Pocket Memos
  • 数独!