{"id":20958515,"url":"https://github.com/junixapp/qingblogbackend","last_synced_at":"2025-05-14T06:32:20.757Z","repository":{"id":108524826,"uuid":"124526759","full_name":"junixapp/QingBlogBackend","owner":"junixapp","description":"Qing博客系统后台，基于Koa2和NodeJs编写。","archived":false,"fork":false,"pushed_at":"2018-07-12T08:22:49.000Z","size":696,"stargazers_count":4,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-02T14:02:14.861Z","etag":null,"topics":["koa","mongoose","nodejs"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/junixapp.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2018-03-09T10:37:09.000Z","updated_at":"2019-07-26T03:18:56.000Z","dependencies_parsed_at":null,"dependency_job_id":"e3208773-940a-4436-bda0-2ccd18a07cac","html_url":"https://github.com/junixapp/QingBlogBackend","commit_stats":null,"previous_names":["junixapp/qingblogbackend"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/junixapp%2FQingBlogBackend","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/junixapp%2FQingBlogBackend/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/junixapp%2FQingBlogBackend/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/junixapp%2FQingBlogBackend/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/junixapp","download_url":"https://codeload.github.com/junixapp/QingBlogBackend/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254084690,"owners_count":22011923,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["koa","mongoose","nodejs"],"created_at":"2024-11-19T01:47:59.648Z","updated_at":"2025-05-14T06:32:15.743Z","avatar_url":"https://github.com/junixapp.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"## QingBlog后端\nKoa2套件 + mongoose\n\n**前端项目为**：[QingBlog前端](https://github.com/li-xiaojun/QingBlogFrontend)\n\n\n## 结构说明\n- `app.js`负责加载router、middlewares，连接db\n- router层只负责映射路由，调用controller层，然后响应success数据，不应该抛出异常，不应该响应错误的数据\n- controller层为router层服务，负责执行业务逻辑，参数检查，读取db，返回数据，抛出异常\n- 中间件负责处理所有的错误返回\n- model为数据结构层\n\n\n\n## 中间件说明\n- `rest_handler.js`负责给ctx安装success方法和error方法，分别是返回成功的数据和失败的数据\n- `err_handler.js`是全局的错误处理中间件，负责处理所有错误的返回，包括api级别，数据库级别，其他未知错误\n- `auth_handler.js`是负责验证token\n- `permission_handler.js`是负责权限检查\n\n\n\n## RestfulAPI设计\n\n\n\u003e code采用字符串，目的是不用查表。\n\n- 成功只有一种，msg只是辅助客户端，所以http响应码为200，内容是：\n\n  ```javascript\n  { code: \"success\", msg: \"成功\", data: xx }\n  ```\n\n- 失败响应码采用500：错误码按照模块分类：\n\n  ```javascript\n  { code: \"errCode\", msg: \"errMsg\" }\n  ```\n  比如errCode设计如下：\n  ```\n  TokenNotExist - token不存在\n  TokenInvalidToken - token失效\n  AuthUsernamePswNotMatched - 用户名或密码错误\n  AuthUserNotExist - 用户不存在\n  BlogNameExist - 名字已存在\n  BlogNotFound - 博客不存在\n  ```\n\n  ​\n\n##  全局错误处理\n\n所有的中间件都将错误抛出，由最外层的`error_handler`中间件来处理，包括数据库异常，最后将错误信息封装为json返回。\n注意，有时候布局代码（比如中间件代码或者controller）可能要try/catch局部异常，**此时千万不要把`await next()`写到try块里面；或者你写进去了，\n那么catch块，一定要有个throw操作，否则后续中间件的异常将被此处捕获，全局错误处理器将失效。**\n\n\n## 启动和部署\n使用pm2。","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjunixapp%2Fqingblogbackend","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjunixapp%2Fqingblogbackend","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjunixapp%2Fqingblogbackend/lists"}