egg笔记

创建egg项目

npm i egg-init -g

egg-init egg-demo --type=simple

egg-mysql传参

get:this.ctx.query
post : this.ctx.request.body
动态路由:this.ctx.params

前台组件内部发请求传参的时候不能直接传[] 数组,只能传字符串格式,JSON.parse([]),不然或报错。是个坑

MVC框架

M:数据层 Model

V:视图 View

C:控制 Controller

跟express对比

MVC

资源充分利用 多核多线程 | express 1核

进程:4个

目录结构

app 源码 入口

​ Controller 控制层 不做逻辑 控制view和数据

​ public 静态资源

​ service 数据库操作 增删改查

​ router.js 路由配置

config 配置

egg简单流程

1.数据库配置

config/config.default.js

config.mysql = {
    // 单数据库信息配置
    client: {
      // host
      host: 'localhost',
      // 端口号
      port: '3306',
      // 用户名
      user: 'root',
      // 密码
      password: 'root',
      // 数据库名
      database: 'muen',
    },
    // 是否加载到 app 上,默认开启
    app: true,
    // 是否加载到 agent 上,默认关闭
    agent: false,
  };
2.config/plugin.js
module.exports = {
  mysql : {
    enable: true,
    package: 'egg-mysql',
  }
};
3.controller控制层 a.js
const Controller = require('egg').Controller;
class A extends Controller{
    //可能用到异步操作
    async index(){
        const { ctx } = this;//ctx类似封装的req,res
        // *如果连接数据库 传参去service操作数据库逻辑
        // *ctx.service.a.index(传参数)
        ctx.body=[1,2,3]//这是直接返回的值  连接数据库的话可以不用写
    }
}
module.exports=A
4.service 数据逻辑 a.js
const Service = require('egg').Service;
calss A extends Controller{
    async index(接收参数){
        const { app } = this;
        await app.mysql.insert('数据表名',参数/object)
    }
    //  get/select('表名')  获取1条或多条数据
    //      get('posts', { id: 12 })
    //      select('posts')
    
    //  insert 添加
    
    //  const result = app.mysql.update({数据})  
    //  const foo = result.affectedRows === 1;  判断更新成功
    
    //  delete('',{id:123})
}

egg总结

1.简介

重量级 后端

js写作

阿里开发

2.安装

1.下载包 npm i egg-init -g

2.egg-init egg-demo --type=simple

3.cd egg-demo && npm i

3.目录

controller 控制层 返回页面 ctx.body="123"

service 数据>mysql(数据库)

public 静态 1.png http://localhost:7001/public/1.png

router.js 路由管理

view 测试接口 视图层 ejs模板引擎 <%%>

4.参数

get: ?name=dxw&age=18 | 动态路由 :id

post: 传参 有坑 egg安全策略限制 必须传特定的参数 (暂时解决方法就是关闭安全策略)

//  config/config.default.js
const config = exports = {
    security: {//关闭安全策略
      csrf: {
        enable: false,
      },
    }
  };

get接收的参数 query获取 this.ctx.query

5.参数校验:
//config/plugin.js
module.exports = {
  mysql: {//mysql数据库
    enable: true,
    package: 'egg-mysql',
  },
  validate:{//参数校验
    enable:true,
    package:'egg-validate'
  }
};

下载 egg-validate依赖 , 在Controller层内的逻辑里添加 try catch

const Controller = require('egg').Controller;

class Updata extends Controller {
    updata() {
        const { ctx } = this;
        console.log(ctx.request.body)

        try {//参数效验 传过来的值必须是number
            ctx.validate({ id: 'number' })
        } catch (e) {
            ctx.body = {
                code: 0,
                msg: e
            }
            return
            //不是number 就停止 不走下方 返回错误信息
        }

        ctx.service.updata.updata(ctx.request.body);
        ctx.body = {
            code: 1,
            msg: '更新成功'
        }
    }
}

module.exports = Updata;
image.png

当前我传过来的id是字符串形式
效验的id是number
不匹配,就会返回错误信息 "should be a number"

image.png

上述的return关键字就会阻止 下方的成功返回信息 和 传到Service层的方法

参数效验 : egg-validate 完。

6.路由重定向
router.redirect('/','/public/aa.html',302)   // 加一个状态码

你可能感兴趣的:(egg笔记)