egg初始化项目

  • 创建文件,初始化egg框架 ```javascript mkdir egg-example && cd egg-example

npm init egg —type=simple

npm i

  1. - 启动项目
  2. ```javascript
  3. npm run dev

// npm run cov:代码测试率 npm run lint — —fix :— —fix 是自动修复eslint中不符合规范的语句

husky插件(做git hooks)

参考文档:huskyhusky官网
是做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”

  1. > 钩子没有触发的情况:
  2. > 当第一次安装`husky`的时候,可能会出现`.git/hooks`里面的文件没有被覆盖的情况;此时,`git hooks`仍然是之前的状态(默认是没有效果的);如果是`husky`安装正常,使用命令`ls .git/hoooks`查看文件则是下面这样:
  3. > 随便打开任意脚本文件
  4. >
  5. ```javascript
  6. #!/bin/sh
  7. # husky
  8. # Created by Husky v4.2.5 (https://github.com/typicode/husky#readme)
  9. # At: 2020-6-16 17:14:54
  10. # From: /Users/snowdream/Desktop/bhb/dp-admin/node_modules/husky (https://github.com/typicode/husky#readme)
  11. . "$(dirname "$0")/husky.sh"

如果不是上述形式,那么就是husky注入失败;可以通过重新安装(先uninstallinstall)进行重新注入,因为每次安装husky时会重新覆盖一次.git/hooks脚本文件。

配置eslint规范

在.eslintrc中配置

  1. {
  2. "extends": "eslint-config-egg",
  3. "rules": {
  4. "semi": ["error", "never"] // 在语句末尾从来不加分号,并且如果有分号则报错
  5. }
  6. }

提交日志规范

参考文档和方案:Commit messagecommitizenvalidate-commit-msg(还有其他很多插件)
主要是为了让规范代码提交的语句

commitizen

  • 安装

    1. npm install -g commitizen
  • 初始化项目,符合commitizen的环境

    1. commitizen init cz-conventional-changelog --save-dev --save-exact
  • 提交代码 ```javascript git add .

// 根据提示选择 git cz

  1. > [validate-commit-msg](https://www.npmjs.com/package/validate-commit-msg)比较严格
  2. <a name="fsQik"></a>
  3. ## 使用JWT的方式来进行存储登录信息
  4. <a name="HMXuy"></a>
  5. ## 后端使用验证码的插件-- svg-captcha
  6. > 前端主要展示图片,具体的图片生成是后端生成的
  7. 参考:[官网](https://www.npmjs.com/package/svg-captcha)
  8. - 安装
  9. ```javascript
  10. npm install --save svg-captcha
  • 后端服务中使用
    • 添加路由

app\router.js

  1. // 验证码
  2. router.get('/captcha', controller.util.captcha)
  • 添加路由的代码

app\controller\util.js

  1. 'use strict'
  2. // 引入插件
  3. const svgCaptcha = require('svg-captcha')
  4. const Controller = require('egg').Controller
  5. class UtilController extends Controller {
  6. async captcha() {
  7. const captcha = svgCaptcha.create({
  8. size: 4,
  9. fontSize: 50,
  10. width: 100,
  11. height: 40,
  12. noise: 10,
  13. })
  14. // 检验文本放入session:captcha.text
  15. this.ctx.session.captcha = captcha.text
  16. this.ctx.response.type = 'image/svg+xml'
  17. this.ctx.body = captcha.data
  18. console.log('captcha:' + captcha.text)
  19. }
  20. }
  21. module.exports = UtilController

对后端的路由进行分组的插件 —- egg-router-group

  1. npm i egg-router-group --save

连接mongodb的插件 —- egg-mongoose

  1. npm i egg-mongoose --save

校验接口传输的数据的插件 —- egg-validate

  1. npm i egg-validate --save

使用md5插件加解密 —- md5

  1. npm i md5 --save

JWT的认证需要的插件 —- jsonwebtoken

  1. npm i jsonwebtoken --save

字符的加密、校验、解密的过程

设置基本的接口规范

  1. ## 接口返回规范
  2. {
  3. code: 0,
  4. data: {},
  5. message: '',
  6. <!-- errors: 具体的报错信息 (可以根据是否是线上环境来判断是否要展示errors -->
  7. }
  8. code 0 是成功 其他都是失败
  9. -1 错误
  10. -666 登录状态过期
  11. <!-- 权限 -->

app\controller\base.js 基本的规范结构

  1. 'use strict'
  2. // 定制规范
  3. const { Controller } = require('egg')
  4. // 在egg的Controller和业务Controller之间加了一层,这一层是规范层
  5. class BaseController extends Controller {
  6. success(data) {
  7. this.ctx.body = {
  8. code: 0,
  9. data,
  10. }
  11. }
  12. message(message) {
  13. this.ctx.body = {
  14. code: 0,
  15. message,
  16. }
  17. }
  18. error(message, code = -1, errors = {}) {
  19. this.ctx.body = {
  20. code,
  21. message,
  22. errors,
  23. }
  24. }
  25. }
  26. module.exports = BaseController

使用接口规范返回数据,并且设置非Resful的接口
app\controller\user.js

  1. 'use strict'
  2. const BaseController = require('./base')
  3. const createRule = {
  4. email: { type: 'email' },
  5. nickname: { type: 'string' },
  6. passwd: { type: 'string' },
  7. captcha: { type: 'string' },
  8. }
  9. class UserController extends BaseController {
  10. async login() {
  11. console.log('login')
  12. }
  13. async register() {
  14. const { ctx } = this
  15. try {
  16. // 校验传递的参数
  17. ctx.validate(createRule)
  18. } catch (e) {
  19. console.log(e)
  20. // 因为从baseController继承了,所以可以有基类可以使用
  21. return this.error('参数校验失败', -1, e.errors)
  22. }
  23. const { email, nickname, passwd, captcha } = ctx.request.body
  24. console.log({ email, nickname, passwd, captcha })
  25. this.success({ name: 'kkb' })
  26. }
  27. async verify() {
  28. // 校验用户名是否存在
  29. }
  30. async info() {
  31. console.log('info')
  32. }
  33. }
  34. module.exports = UserController

app\router.js

  1. 'use strict'
  2. /**
  3. * @param {Egg.Application} app - egg application
  4. */
  5. module.exports = app => {
  6. const { router, controller } = app
  7. router.group({
  8. name: 'user',
  9. prefix: '/user', // 路由前缀
  10. }, router => {
  11. const {info, register, login, verify} = controller.user
  12. router.get('/info', info)
  13. router.post('/register', register)
  14. router.post('/login', login)
  15. router.get('/verify', verify)
  16. })
  17. }

对安装的插件进行配置

config\config.default.js是默认配置

config\plugin.js是对安装的插件进行配置

  1. 'use strict'
  2. // /** @type Egg.EggPlugin */
  3. // module.exports = {
  4. // // had enabled by egg
  5. // // static: {
  6. // // enable: true,
  7. // // }
  8. // }
  9. // 分开配置
  10. exports.mongoose = {
  11. enable: true,
  12. package: 'egg-mongoose'
  13. }
  14. exports.routerGroup = {
  15. enable: true,
  16. package: 'egg-router-group'
  17. }
  18. exports.validate = {
  19. enable: true,
  20. package: 'egg-validate'
  21. }

配置数据库和其他

config\config.default.js

  1. /* eslint valid-jsdoc: "off" */
  2. 'use strict'
  3. /**
  4. * @param {Egg.EggAppInfo} appInfo app info
  5. */
  6. module.exports = appInfo => {
  7. /**
  8. * built-in config
  9. * @type {Egg.EggAppConfig}
  10. **/
  11. const config = exports = {}
  12. // use for cookie sign key, should change to your own and keep security
  13. config.keys = appInfo.name + '_1617240484420_9074'
  14. // add your middleware config here
  15. config.middleware = []
  16. // add your user config here
  17. const userConfig = {
  18. // myAppName: 'egg',
  19. }
  20. return {
  21. ...config,
  22. ...userConfig,
  23. // 配置egg,js
  24. security: {
  25. csrf: { // csrf是egg对post请求自带的,先临时关闭
  26. enable: false,
  27. },
  28. },
  29. // 配置数据库
  30. mongoose: {
  31. client: {
  32. url: 'mongodb://127.0.0.1:27017/kkbhub',
  33. options: {
  34. },
  35. },
  36. },
  37. }
  38. }

发邮件的库——nodemailer

参考文档:官网文档

  1. 安装

    1. npm install nodemailer --save
  2. 使用

app\service\tools.js

  1. 'use strict'
  2. const { Service } = require('egg')
  3. const nodemailer = require('nodemailer')
  4. // 新建一个发送者,service是配置一个什么服务
  5. const userEmail = '223859391@qq.com'
  6. const transporter = nodemailer.createTransport({
  7. service: 'QQ',
  8. secureConnection: true,
  9. auth: {
  10. user: userEmail,
  11. pass: 'jrmpukkyreynbhib', // jrmpukkyreynbhib
  12. },
  13. })
  14. class ToolService extends Service {
  15. async sendMail(email, subject, text, html) {
  16. const mailOptions = {
  17. from: userEmail,
  18. cc: userEmail, // 抄送,可以避免有的邮箱认为这个是垃圾邮件(这个是一个小tip)
  19. to: email,
  20. subject,
  21. text,
  22. html,
  23. }
  24. try {
  25. await transporter.sendMail(mailOptions)
  26. return true
  27. } catch (err) {
  28. console.log('email error', err)
  29. return false
  30. }
  31. }
  32. }
  33. module.exports = ToolService

如果是qq邮箱的话,则需要到下面的这个网址开启相关的服务:qq开启服务指导手册

egg-mongoose的使用

参考:https://juejin.cn/post/6844903772775268366