{"id":15209070,"url":"https://github.com/sessionboy/sinn-server","last_synced_at":"2025-05-09T00:11:06.816Z","repository":{"id":218439668,"uuid":"85486953","full_name":"sessionboy/sinn-server","owner":"sessionboy","description":"an node server for sinn,that based on of nodejs,koa2,mongoose,docker,nginx,es6/7,Resful API,阿里云  http://servertest.boyagirl.com/","archived":false,"fork":false,"pushed_at":"2018-12-09T14:45:32.000Z","size":6936,"stargazers_count":227,"open_issues_count":3,"forks_count":42,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-03-31T19:44:11.092Z","etag":null,"topics":["async-await","docker","ejs","es6","koa2","mongoose","nginx","nodejs","restful-api"],"latest_commit_sha":null,"homepage":"","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/sessionboy.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}},"created_at":"2017-03-19T15:28:03.000Z","updated_at":"2024-09-21T10:14:31.000Z","dependencies_parsed_at":"2024-01-22T00:06:35.316Z","dependency_job_id":"2777b195-4ba7-4105-85ed-d712003bd07c","html_url":"https://github.com/sessionboy/sinn-server","commit_stats":null,"previous_names":["sessionboy/sinn-server"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sessionboy%2Fsinn-server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sessionboy%2Fsinn-server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sessionboy%2Fsinn-server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sessionboy%2Fsinn-server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sessionboy","download_url":"https://codeload.github.com/sessionboy/sinn-server/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253166521,"owners_count":21864482,"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":["async-await","docker","ejs","es6","koa2","mongoose","nginx","nodejs","restful-api"],"created_at":"2024-09-28T07:21:08.723Z","updated_at":"2025-05-09T00:11:06.778Z","avatar_url":"https://github.com/sessionboy.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"## sinn-server\n [sinn-server](https://github.com/sessionboy/sinn)是[sinn](https://github.com/sessionboy/sinn)的后端实现，支持async/await，docker一键部署，Resful风格API，支持阿里云oss和七牛云存储，自带管理后台。\n\n * 线上测试demo: http://servertest.boyagirl.com\n\n * 测试账户: sinn  密码：admin\n \n 如果觉得可以，右上角点颗星星噢~   \n \n \n 也欢迎来我的社区蹦迪：[探知社区](https://www.tanzhi.club/)\n \n## 主要技术栈 \n```\nnodejs, koa2, mongoose, docker, es6, async/await,  Resful API\n```\n     \n## HOW TO USE?\n   \n#### 一，node版本要求      \n     \n* node版本7.x，推荐使用最新版本     \n     \n* 使用koa2，默认支持async/await，7.x以上node版本      \n   \n#### 二，项目配置    \n   \n* 前提:   确定本地已安装和启动mongodb，并可正常访问 (配置远程数据库可忽略)  \n   \n* 数据库配置： 在/config/common.js中配置你的数据库信息，分development/production，默认mongodb://localhost:27017/sinn    \n   \n```\n# 默认配置 \nmongo: {\n    uri: 'mongodb://localhost:27017/sinn'\n }    \n   \n\n# 连接远程数据库示例\n   \nmongo: {\n    uri: 'mongodb://10.0.10.10:27017/sinn'\n }      \n    \n# 带验证数据库连接示例\n   \nmongo: {\n    uri: 'mongodb://用户名:密码@10.0.10.10:27017/sinn'\n }      \n```     \n   \n* 端口号port： 在/config/common.js中配置你的port，默认8080端口     \n   \n* 管理后台默认账户配置:   在/config/admin.js中配置你的管理员账户，用于管理后台登录      \n    \n  ```\n  # 默认账户   \n  {\n     name: 'sinn',\n     password: md5('admin')  // md5用于加密，登录时输入admin即可\n  }\n  ```     \n   \n\n#### 三，启动       \n    \n* 首先拉代码     \n     \n\n```\ngit clone git@github.com:sessionboy/sinn-server.git\n```    \n     \n* 安装依赖    \n     \n```\nnpm install\n```      \n    \n或者使用淘宝镜像(推荐)     \n    \n```\nnpm install --registry=https://registry.npm.taobao.org\n```    \n    \n* 开发环境启动     \n   \n```\nnpm run dev\n```\n      \n* 生产环境启动    \n   \n```\nnpm start\n```      \n   \n* 浏览器打开    \n   \n```\nhttp://localhost:8080\n```\n* 管理后台可用你在/config/admin.js配置的账号登录，登录后可在用户管理中添加新管理账户   \n* 前端上传功能需要先配置好sdk，在/config/common.js中配置，默认采用阿里云oss\n* 如果你使用七牛云，请先配置好七牛云的sdk，并在/rest/routes/frontend.js修改上传接口的中间件为七牛中间件,如下:\n```\n ……\n post('/api/article/create_upload', upload.qiniu, ArticleController.create_upload)\n ……\n post('/api/user/put_avatar', upload.qiniu, UserController.put_avatar)\n ……\n```\n\n#### 三，项目结构      \n   \n* 入口文件：  app.js    \n     \n* 项目配置文件:    /config/*    \n   \n* 静态资源目录:   /public/*    \n   \n* 管理后台视图 :   /views/*     \n    \n* rest api :    /rest/*     \n  \n* 工具库 :  /rest/utils/*     \n  \n* 接口router配置 :  /rest/routes/*     \n      \n* schema/数据库 :  /rest/models/*      \n  \n* 接口逻辑层 :  /rest/controllers/*     \n  \n* 公共中间件 :  /rest/middlewares/*     \n  \n提示：在rest中，frontend是为前端[sinn](https://github.com/sessionboy/sinn)准备的API, 而backend则是为sinn-server管理后台准备的API   \n           \n##   统一处理响应请求 (成功/失败)  \n   \n  为了方便统一处理，封装了统一响应中间件response.js   \n  响应中间件规定了数据响应格式，是与前台约定的规则    \n  具体请看/rest/middlewares/response.js  的注释详解    \n\n  ```\n# 返回错误\n  调用 ctx.error({\n         msg: '响应的错误提示',\n         status: '自定义错误码，默认为400',\n         data: '响应错误时可返回的数据',\n         error: '响应的具体错误信息'\n       })      \n     \n# 返回成功    \n  调用 ctx.success({\n      msg: '响应的成功提示',\n      data: '响应的数据',\n    })\n  ```\n\n##   统一错误处理\n\n错误分两种，一种是api的错误，另一种则是内部错误 ，api错误需要手动处理， 内部错误则使用try/catch捕获   \n   \n#### 一，api错误   \n      \napi错误很常见，可分场景，类型也很多种，对于api错误，可在代码逻辑中使用ctx.error()方法作响应处理 , 示例：\n   \n```\n  async login(){\n   \n    const { username, password } = ctx.request.body; \n\n    if( !username || !password ) return ctx.error({ msg: '信息填写错误!', status: 403 })     \n    \n    ……\n\n  }\n```\n   \n#### 二， 内部错误     \n    \n* 所谓内部错误，即由node内部throw机制抛出的异常错误，比如500错误。    \n   \n* 对于这类错误，则需要使用try/catch来捕获，但如果每个接口逻辑中都try/catch一遍，那是极其繁琐的，也不雅观。为此可以封装一个try/catch中间件，用于捕获这类异常，并对客户端作出响应    \n   \n* try/catch中间件:  /rest/middlewares/filter.js     \n  \n\n   \n该中间件使用了[tracer](https://github.com/baryon/tracer)处理错误日志，你并不需要做什么    \n   \n如果你需要自定义拓展，比如改用[log4js](https://github.com/nomiddlename/log4js-node)处理错误日志，可自行修改   \n\n \n## 文件上传 ( 支持阿里云oss / 七牛云  ) \n   \n 本人使用阿里云服务器，于是使用阿里云oss作为cdn存储空间    \n   \n 鉴于很多人习惯使用七牛云，于是多封装了个七牛云上传中间件（个人推荐强大的阿里云）    \n   \n#### 一，阿里云oss上传    \n     \n* 信息配置：/config/common.js    示例:      \n    \n```\n// 图片上传到阿里云oss\nalioss: { \n       region: 'oss-cn-shenzhen',     // 仅做参考\n  \n       accessKeyId: 'ALALsdfSLdfgSD',     // 仅做参考\n\n       accessKeySecret: '5jWRVV8DVFDV8D67F6D6G76G7F6GD764',     // 仅做参考\n\n       bucket: 'sinn',    // 空间名, 仅做参考\n\n       folder: 'images/'  // 上传到空间下指定文件夹，需要提前创建。不填则会上传到空间根目录下。\n\n }\n```\n    \n* sdk封装:  /rest/utils/alioss.js  (已封装好，你不需要做修改)  \n   \n* ali-oss上传中间件:  /rest/middlewares/upload.js ——  alioss\n\n* 中间件使用：只需要在定义接口时加入alioss中间件即可。该上传中间件会返回两个字段    \n    \n  url: 文件上传成功后返回的可访问该文件的url   \n     \n  id: 登录用户的id   （ 前端调用上传接口时需要提供用户id字段 ）\n\n中间件会把这两个字段用upload对象 { url, id } 挂载在ctx传递给下个中间件，具体实现:  \n   \n```\n ……\n   ctx.upload = { url , id }  // 上传结果挂载在ctx,传递给下个中间件  \n ……\n\n```\n因此，你可以在API逻辑层中直接获取到上传结果 ，上传的逻辑已经由中间件处理完成    \n   \n\n示例：  \n   \n```\n import upload from '../middlewares/upload'; // 引入上传中间件\n\n const router = require('koa-router')();\n\n router.post('/api/upload',upload.alioss, async (ctx)=\u003e{\n    \n   const { url, id } = ctx.upload;   // 可直接在ctx获取到上传结果upload对象\n   \n   ……\n})    \n   \n```\n    \n#### 二，七牛云上传中间件    \n    \n* 信息配置:    /config/common.js  (和阿里云oss不同的是七牛不支持在空间下自定义文件夹，因此不需要配置folder)\n    \n* sdk封装:    /rest/utils/qiniu.js  (已封装好，你不需要做修改)   \n   \n* qiniu上传中间件:  /rest/middlewares/upload.js ——  qiniu    \n   \n   qiniu中间件的用法和alioss中间件用法相同，不同在于它们调用的sdk不同   \n   \n\n ## 项目部署    \n   \n * server端使用[docker](https://docs.docker.com)进行部署，如果你不了解[docker](https://docs.docker.com)，可先自行学习一番，相信用过之后你会着迷        \n   \n* 当然你也可以不使用[docker](https://docs.docker.com)部署，完全可以手工搭建各种环境来实现部署，具体看个人情况    \n   \n* 个人推荐使用docker  \n   \n####  一， docker 脚本    \n   \n本开源项目提供四个docker脚本（仅供参考）, 分别是build.sh, push.sh , release.sh, Dockerfile    \n```\n# node基础镜像可根据自身需要来调整,你可以采用你自己的\n# 默认采用我仓库的node镜像(docker官方node镜像,node版本7.5)，你可以直接使用   \n\n* Dockerfile  镜像构建配置脚本 \n    \n* build.sh   构建项目镜像   \n   \n* push.sh  推送项目镜像     \n   \n* release.sh   启动项目镜像 （跑项目）\n```\n     \n请根据你自己的服务器配置，对以上脚本做相应的配置更改\n  \n####  二， 一键部署——update-release.sh （仅供参考）    \n   \n* 这个脚本使用rsync实现代码同步，并执行上面四个脚本，最终实现一键部署    \n   \n* 需要根据自己的使用环境作相应的更改   \n  \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsessionboy%2Fsinn-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsessionboy%2Fsinn-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsessionboy%2Fsinn-server/lists"}