Golang Go语言中 gin 中间件怎么传值

发布于 1周前 作者 itying888 来自 Go语言

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

		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
	}

但是在方法里边获取报错


Golang Go语言中 gin 中间件怎么传值

更多关于Golang Go语言中 gin 中间件怎么传值的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

13 回复

<br>// Header is a intelligent shortcut for c.Writer.Header().Set(key, value).<br>// It writes a header in the response.<br>// If value == "", this method removes the header `c.Writer.Header().Del(key)`<br>func (c *Context) Header(key, value string) {<br> if value == "" {<br> c.Writer.Header().Del(key)<br> return<br> }<br> c.Writer.Header().Set(key, value)<br>}<br><br>// GetHeader returns value from request headers.<br>func (c *Context) GetHeader(key string) string {<br> return c.requestHeader(key)<br>}<br><br>

更多关于Golang Go语言中 gin 中间件怎么传值的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


中间件加个日志, 确保你的 user set 进去了

auth.Use(middleware.UserAuth).Use(func(ctx *gin.Context) {
controller.User = ctx.MustGet(“user”).(*models.Users)
})


中间件顺序对了吗

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
}

我是直接转化成字符串来处理

谢谢各位,现在可以了。

请教下,可变变量如何传值

获取了一个数组[1,2,3]
我转化的数据是"1","2"
但是给 redis 传值失败
func (c *cmdable) HMGet(key string, fields …string) *SliceCmd

你的用法错了, 调用的时候应该是
fields := []string{“name”, “age”, “weight”}
key := "users:1"

redis.HMGet(key, fields…)

明白了

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

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

怎么把他们拼接到一个列表上。

类似于 php 的 array_merge 把不同字段的数组拼接到一块

返回的 json 如下

[{“id”:1},{“name”:"\u674e\u56db"},{“name”:"\u5f20\u4e09"}]

没理解你的意思, 不应该是第一行吗? 直接给原始数据和返回后的数据看看

我试出来了,首先定义个新结构体,然后 make 这个结构,对这个结构体赋值{“id”:1}。然后对{“name”:"\u674e\u56db"},{“name”:"\u5f20\u4e09"}结构体循环赋值到新结构体上。

在Go语言的Gin框架中,中间件(Middleware)是用于在处理HTTP请求之前或之后执行特定任务的函数。要在中间件之间传递值,通常有以下几种方法:

  1. 使用Gin的上下文(Context): Gin的上下文对象*gin.Context在整个请求的生命周期内是共享的,你可以通过它来在中间件之间传递数据。使用context.Set(key, value)存储数据,context.Get(key)获取数据。例如:

    func Middleware1(c *gin.Context) {
        c.Set("myKey", "myValue")
        c.Next()
    }
    
    func Middleware2(c *gin.Context) {
        value := c.Get("myKey")
        // 使用value做进一步处理
        c.Next()
    }
    
  2. 使用请求作用域变量: 如果数据只需要在某个特定请求处理函数中使用,可以在该处理函数中直接从上下文中获取。

  3. 全局变量或状态管理: 对于需要在多个请求之间共享的数据,可以考虑使用全局变量、数据库或分布式缓存等状态管理方式。不过,这种方法需要谨慎使用,以避免数据竞争和副作用。

通常情况下,推荐使用Gin的上下文来在中间件之间传递数据,因为它简单且符合Gin框架的设计哲学。确保在适当的时候调用c.Next()以继续请求处理流程。

回到顶部