egg初始化项目
- 创建文件,初始化egg框架 ```javascript mkdir egg-example && cd egg-example
npm init egg —type=simple
npm i
- 启动项目```javascriptnpm run dev
// npm run cov:代码测试率 npm run lint — —fix :— —fix 是自动修复eslint中不符合规范的语句
husky插件(做git hooks)
参考文档:husky、husky官网
是做git hooks的(在git操作的时候的钩子。即在git操作的时候进行响应的操作)
- 安装husky ```javascript // Edit package.json > prepare script and run it once: npm set-script prepare “husky install” && npm run prepare
// Add a hook: npx husky add .husky/pre-commit “npm test”
> 钩子没有触发的情况:> 当第一次安装`husky`的时候,可能会出现`.git/hooks`里面的文件没有被覆盖的情况;此时,`git hooks`仍然是之前的状态(默认是没有效果的);如果是`husky`安装正常,使用命令`ls .git/hoooks`查看文件则是下面这样:> 随便打开任意脚本文件>```javascript#!/bin/sh# husky# Created by Husky v4.2.5 (https://github.com/typicode/husky#readme)# At: 2020-6-16 17:14:54# From: /Users/snowdream/Desktop/bhb/dp-admin/node_modules/husky (https://github.com/typicode/husky#readme). "$(dirname "$0")/husky.sh"
如果不是上述形式,那么就是
husky注入失败;可以通过重新安装(先uninstall再install)进行重新注入,因为每次安装husky时会重新覆盖一次.git/hooks脚本文件。
配置eslint规范
在.eslintrc中配置
{"extends": "eslint-config-egg","rules": {"semi": ["error", "never"] // 在语句末尾从来不加分号,并且如果有分号则报错}}
提交日志规范
参考文档和方案:Commit message、commitizen、validate-commit-msg(还有其他很多插件)
主要是为了让规范代码提交的语句
commitizen
安装
npm install -g commitizen
初始化项目,符合commitizen的环境
commitizen init cz-conventional-changelog --save-dev --save-exact
提交代码 ```javascript git add .
// 根据提示选择 git cz
> [validate-commit-msg](https://www.npmjs.com/package/validate-commit-msg)比较严格<a name="fsQik"></a>## 使用JWT的方式来进行存储登录信息<a name="HMXuy"></a>## 后端使用验证码的插件-- svg-captcha> 前端主要展示图片,具体的图片生成是后端生成的参考:[官网](https://www.npmjs.com/package/svg-captcha)- 安装```javascriptnpm install --save svg-captcha
- 后端服务中使用
- 添加路由
app\router.js
// 验证码router.get('/captcha', controller.util.captcha)
- 添加路由的代码
app\controller\util.js
'use strict'// 引入插件const svgCaptcha = require('svg-captcha')const Controller = require('egg').Controllerclass UtilController extends Controller {async captcha() {const captcha = svgCaptcha.create({size: 4,fontSize: 50,width: 100,height: 40,noise: 10,})// 检验文本放入session:captcha.textthis.ctx.session.captcha = captcha.textthis.ctx.response.type = 'image/svg+xml'this.ctx.body = captcha.dataconsole.log('captcha:' + captcha.text)}}module.exports = UtilController
对后端的路由进行分组的插件 —- egg-router-group
npm i egg-router-group --save
连接mongodb的插件 —- egg-mongoose
npm i egg-mongoose --save
校验接口传输的数据的插件 —- egg-validate
npm i egg-validate --save
使用md5插件加解密 —- md5
npm i md5 --save
JWT的认证需要的插件 —- jsonwebtoken
npm i jsonwebtoken --save
字符的加密、校验、解密的过程
设置基本的接口规范
## 接口返回规范{code: 0,data: {},message: '',<!-- errors: 具体的报错信息 (可以根据是否是线上环境来判断是否要展示errors) -->}code 0 是成功 其他都是失败-1 错误-666 登录状态过期<!-- 权限 -->
app\controller\base.js 基本的规范结构
'use strict'// 定制规范const { Controller } = require('egg')// 在egg的Controller和业务Controller之间加了一层,这一层是规范层class BaseController extends Controller {success(data) {this.ctx.body = {code: 0,data,}}message(message) {this.ctx.body = {code: 0,message,}}error(message, code = -1, errors = {}) {this.ctx.body = {code,message,errors,}}}module.exports = BaseController
使用接口规范返回数据,并且设置非Resful的接口
app\controller\user.js
'use strict'const BaseController = require('./base')const createRule = {email: { type: 'email' },nickname: { type: 'string' },passwd: { type: 'string' },captcha: { type: 'string' },}class UserController extends BaseController {async login() {console.log('login')}async register() {const { ctx } = thistry {// 校验传递的参数ctx.validate(createRule)} catch (e) {console.log(e)// 因为从baseController继承了,所以可以有基类可以使用return this.error('参数校验失败', -1, e.errors)}const { email, nickname, passwd, captcha } = ctx.request.bodyconsole.log({ email, nickname, passwd, captcha })this.success({ name: 'kkb' })}async verify() {// 校验用户名是否存在}async info() {console.log('info')}}module.exports = UserController
app\router.js
'use strict'/*** @param {Egg.Application} app - egg application*/module.exports = app => {const { router, controller } = approuter.group({name: 'user',prefix: '/user', // 路由前缀}, router => {const {info, register, login, verify} = controller.userrouter.get('/info', info)router.post('/register', register)router.post('/login', login)router.get('/verify', verify)})}
对安装的插件进行配置
config\config.default.js是默认配置
config\plugin.js是对安装的插件进行配置
'use strict'// /** @type Egg.EggPlugin */// module.exports = {// // had enabled by egg// // static: {// // enable: true,// // }// }// 分开配置exports.mongoose = {enable: true,package: 'egg-mongoose'}exports.routerGroup = {enable: true,package: 'egg-router-group'}exports.validate = {enable: true,package: 'egg-validate'}
配置数据库和其他
config\config.default.js
/* eslint valid-jsdoc: "off" */'use strict'/*** @param {Egg.EggAppInfo} appInfo app info*/module.exports = appInfo => {/*** built-in config* @type {Egg.EggAppConfig}**/const config = exports = {}// use for cookie sign key, should change to your own and keep securityconfig.keys = appInfo.name + '_1617240484420_9074'// add your middleware config hereconfig.middleware = []// add your user config hereconst userConfig = {// myAppName: 'egg',}return {...config,...userConfig,// 配置egg,jssecurity: {csrf: { // csrf是egg对post请求自带的,先临时关闭enable: false,},},// 配置数据库mongoose: {client: {url: 'mongodb://127.0.0.1:27017/kkbhub',options: {},},},}}
发邮件的库——nodemailer
参考文档:官网文档
安装
npm install nodemailer --save
使用
app\service\tools.js
'use strict'const { Service } = require('egg')const nodemailer = require('nodemailer')// 新建一个发送者,service是配置一个什么服务const userEmail = '223859391@qq.com'const transporter = nodemailer.createTransport({service: 'QQ',secureConnection: true,auth: {user: userEmail,pass: 'jrmpukkyreynbhib', // jrmpukkyreynbhib},})class ToolService extends Service {async sendMail(email, subject, text, html) {const mailOptions = {from: userEmail,cc: userEmail, // 抄送,可以避免有的邮箱认为这个是垃圾邮件(这个是一个小tip)to: email,subject,text,html,}try {await transporter.sendMail(mailOptions)return true} catch (err) {console.log('email error', err)return false}}}module.exports = ToolService
如果是qq邮箱的话,则需要到下面的这个网址开启相关的服务:qq开启服务指导手册
