V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  jeffmingup  ›  全部回复第 1 页 / 共 1 页
回复总数  4
要不设置值用 gin 的 c.Set("Email", "123") 取值可以直接用 db.Statement.Context.("Email").(string) 因为 gin 的 context 是自己的实现的,gin 的 ContextWithFallback 参数默认 false ,会直接返回 nil
package main

import (
"log"

"github.com/gin-gonic/gin"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)

type User struct {
gorm.Model
Name string
Email string
}

func (u *User) BeforeCreate(tx *gorm.DB) (err error) {
if u.Email == "" {
ctx := tx.Statement.Context
if v, ok := ctx.Value("Email").(string); ok {
u.Email = v
}
}
return
}

func main() {
// 初始化 Gin 路由器实例
r := gin.Default()

// 初始化 Gorm 数据库连接
dsn := "root:root@tcp(127.0.0.1:3306)/gorm-example?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}

// 自动迁移模型结构体到数据库表
db.AutoMigrate(&User{})

// 创建处理程序函数
createUser := func(c *gin.Context) {
var user User
if err := c.ShouldBindJSON(&user); err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
log.Println("Email:", c.GetString("Email"))
db.WithContext(c).Create(&user)
c.JSON(200, user)
}

// 自定义中间件,设置 example 变量为 123
r.Use(func(c *gin.Context) {
c.Set("Email", "[email protected]")
c.Next()
})
// 在路由器实例中注册处理程序函数

r.POST("/users", createUser)

// 启动 Gin 服务器,监听 HTTP 请求
r.Run(":8080")
}
我试了一下,这样可以,你对照着看下呢
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3640 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 14ms · UTC 04:43 · PVG 12:43 · LAX 21:43 · JFK 00:43
Developed with CodeLauncher
♥ Do have faith in what you're doing.