gin 中间件怎么传值

2023-01-09 11:55:41 +08:00
 awanganddong

//中间件里边是这样定义的

		var user models.User
		res := pkg.Db.Model(&models.User{}).Where("accid = ?", accid).
			Where("token = ?", token).
			Where("token_expire >= ?", time.Now().Unix()).Find(&user)
		if res.Error != nil {
			pkg.Fail(c, 403, "用户 token 已失效", nil)
			c.Abort()
			return
		}
		c.Set("user", user)
        
        
        
	user, ok := c.Get("user")
	if !ok {
		return errors.New("获取用户信息失败"), nil
	}

但是在方法里边获取报错

1870 次点击
所在节点    Go 编程语言
12 条回复
Aresrun
2023-01-09 12:10:11 +08:00
```
// Header is a intelligent shortcut for c.Writer.Header().Set(key, value).
// It writes a header in the response.
// If value == "", this method removes the header `c.Writer.Header().Del(key)`
func (c *Context) Header(key, value string) {
if value == "" {
c.Writer.Header().Del(key)
return
}
c.Writer.Header().Set(key, value)
}

// GetHeader returns value from request headers.
func (c *Context) GetHeader(key string) string {
return c.requestHeader(key)
}

```
seth19960929
2023-01-09 13:25:47 +08:00
中间件加个日志, 确保你的 user set 进去了
hteen
2023-01-09 13:36:26 +08:00
auth.Use(middleware.UserAuth).Use(func(ctx *gin.Context) {
controller.User = ctx.MustGet("user").(*models.Users)
})


中间件顺序对了吗
awanganddong
2023-01-09 14:46:29 +08:00
fmt.Printf("%v", user)
userInfo, err := json.Marshal(user)
if err != nil {
pkg.Fail(c, 403, "用户信息转化失败", nil)
c.Abort()
return
}
c.Writer.Header().Set("userInfo", string(userInfo))



user := c.Writer.Header().Get("userInfo")
err := json.Unmarshal([]byte(user), &userInfo)
if err != nil {
return err, nil
}

我是直接转化成字符串来处理
awanganddong
2023-01-09 14:46:38 +08:00
谢谢各位,现在可以了。
awanganddong
2023-01-09 15:44:16 +08:00
@seth19960929 请教下,可变变量如何传值

获取了一个数组[1,2,3]
我转化的数据是"1","2"
但是给 redis 传值失败
func (c *cmdable) HMGet(key string, fields ...string) *SliceCmd
seth19960929
2023-01-10 10:13:28 +08:00
@awanganddong 你的用法错了, 调用的时候应该是
fields := []string{"name", "age", "weight"}
key := "users:1"

redis.HMGet(key, fields...)
awanganddong
2023-01-10 10:19:01 +08:00
@seth19960929 明白了

顺便问下,go 返回值怎么拼接返回的结构。

比如第一个列,展示 3 个字段。其余几列都是 10 个字段,

怎么把他们拼接到一个列表上。
awanganddong
2023-01-10 10:23:01 +08:00
类似于 php 的 array_merge 把不同字段的数组拼接到一块
awanganddong
2023-01-10 10:27:36 +08:00
返回的 json 如下

[{"id":1},{"name":"\u674e\u56db"},{"name":"\u5f20\u4e09"}]
seth19960929
2023-01-10 13:31:20 +08:00
@awanganddong 没理解你的意思, 不应该是第一行吗? 直接给原始数据和返回后的数据看看
awanganddong
2023-01-10 19:31:59 +08:00
@seth19960929 我试出来了,首先定义个新结构体,然后 make 这个结构,对这个结构体赋值{"id":1}。然后对{"name":"\u674e\u56db"},{"name":"\u5f20\u4e09"}结构体循环赋值到新结构体上。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/907558

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX