beego学习2

beego执行逻辑

image_1cjtbnflsj961esq4ujqi66fm9.png-144.5kB


控制器

beego是严格遵循MVC的模式的 所以它的控制器是非常重要的 他的路由注册是有点特别的 它是一个URL前缀对应一个控制器 然后控制器里面定义不同的http methods对应的处理函数

一般声明一个控制器的方法就是自创建一个结构体 包含一个beego.Controller原生的控制器

现在我们来看一下控制器的内部

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
type Controller struct {
// 上下文数据
Ctx *context.Context
// 用来存储一些配置等信息非常方便
Data map[interface{}]interface{}

// 控制器的一些基本介绍信息 名字之类的
controllerName string
actionName string
methodMapping map[string]func() //method:routertree
gotofunc string
AppController interface{}

// 渲染模板信息 模板名字等 这个现在而言不是很重要
TplName string
ViewPath string
Layout string
LayoutSections map[string]string // the key is the section name and the value is the template name
TplPrefix string
TplExt string
EnableRender bool

// 跨域数据
_xsrfToken string
XSRFExpire int
EnableXSRF bool

// session数据
CruSession session.Store
}

所以一个beego控制器中含有以下几部分内容

  • 上下文数据
  • 控制器基本信息
  • 渲染模板信息
  • 跨域信息
  • session信息

json对象转struct

当路由的方法是post的时候 旺旺需要post一些json对象到后端 那么将他们转为json对象就尤为必要 但是当这个struct结构含有匿名函数的时候需要注意一下

1.当struct没有匿名成员的时候

一切跟平时将json转struct没什么区别 只注意要讲结构体内的成员首字母为大写来声明 不然没有导出的字段是无法被赋值上去的

2.当时结构体含有匿名成员的时候

我们要记住 其实匿名成员里面的所有字段都是直接属于最外面的结构体的 所以我们post表单的时候要注意 不需要给匿名成员提供key 直接将匿名成员里面的字段作为一对key-value对就行了

例如
结构体设计如下

1
2
3
4
5
6
7
8
9
type User struct {
Desc
Name string `json:"name"`
Id int `json:"id"`
}

type Desc struct {
Num int `json:"num"`
}

那么在postman这边需要这样提交post json对象
image_1ck1fk2v9194l1vln1s2mlbl1u349.png-20.5kB

结果
image_1ck1fkq7n1h2319mn1c2vdp6hmpm.png-9.6kB


copybody bug

这里真的是神坑 浪费了我很多时间 在beego的post路由函数中 我们一般是这样接受发送过来的json对象的

1
2
3
if err := json.Unmarshal(this.Ctx.Input.RequestBody, &f); err == nil {
//
}

但是有可能一直报错unexpected end of json data json对象的结构不对?但是postman上并没有显示报错啊这就很迷了

实质上是这是因为没有设置copyrequestbody = true 所以post过去的数据一直都是空的 但是我的配置文件上一直有这句话啊 比较坑的是 其实配置文件并没有被加载进去 beego没有加载了你的配置文件 而是加载了默认的配置文件 比较坑的是beego并没有报错说配置文件找不到 所以copyrequestbody一直为false

解决方法是在运行配置那里修改working directory修改为beego项目的根目录 这样beego就可以找到你的配置文件的正确目录了

真的是神坑 beego找不到配置文件目录竟然不会报错。。。