小程序后台不应直接用gin.Default(),因其自动加载的Logger中间件会因调试请求刷屏日志,Recovery中间件返回HTML而非必需的JSON格式,易导致前端解析失败;应改用gin.New()手动装配日志写入文件、统一JSON错误响应及panic捕获中间件。

为什么不用 gin.Default() 直接启动小程序后台
gin.Default() 会自动加载
Logger 和
Recovery 中间件,但小程序请求常带大量重复、低质量的调试请求(如开发工具频繁重连、未授权的
GET / 探测),这些日志会快速刷屏、掩盖真实错误;
Recovery 在 panic 时返回 HTML 页面,而小程序后端必须返回 JSON 格式响应,否则前端解析失败报
JSON parse error。
你应该用
gin.New() 手动装配中间件:
- 必须加
gin.LoggerWithWriter() 指向文件或过滤非业务路径
- 必须加自定义错误中间件,统一返回
{"code":500,"msg":"server error"} 结构
- 避免直接用
gin.Recovery(),改用
defer +
c.AbortWithStatusJSON(500, ...) 捕获 panic
小程序登录态校验必须用 Authorization: Bearer <token> 而不是 cookie
微信小程序所有请求默认不带 cookie,且服务端无法写入 cookie(
Set-Cookie 被忽略),所以不能依赖 session 或 gin 的
cookie 相关方法。
JWT 是唯一可行方案:
- 登录接口返回
{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."},前端存入
wx.setStorageSync('token', ...)
- 后续每个请求 header 带
Authorization: Bearer xxx
- 后端用
jwt-go 或
github.com/appleboy/gin-jwt 解析,注意:
-
Exp 字段必须设为秒级(不是毫秒),否则微信开发者工具里 token 总过期
- 不要用
time.Now().Add(time.Hour * 24) 算 exp,改用
time.Now().Unix() + 86400 避免时区偏差
- 校验失败必须返回
401 +
{"code":401,"msg":"unauthorized"},小程序
wx.request 的
fail 回调才触发
c.ShouldBindJSON() 绑定失败时不报 400,而是静默跳过
这是 Gin 默认行为:如果请求 body 不是合法 JSON 或字段类型不匹配,
c.ShouldBindJSON(&req) 返回
nil,但
req 字段全为零值(如
int 是
0,
string 是
""),导致后续逻辑误判。
必须显式检查:
- 用
if err := c.ShouldBindJSON(&req); err != nil { c.AbortWithStatusJSON(400, gin.H{"code": 400, "msg": "invalid json"}); return }
- 结构体字段加
binding:"required" 标签(如
OpenID string `json:"openId" binding:"required"`)
- 小程序传数字 ID 常带引号(如
"123"),对应 Go 字段类型必须是
string,不能是
int64,否则绑定失败
小程序上传文件必须用 c.FormFile("file"),不能用 c.GetRawData()
微信小程序
wx.uploadFile 发送的是
multipart/form-data,不是纯二进制流。若错误使用
c.GetRawData() 读取,会得到一串含 boundary 的乱码,且无法提取文件名和类型。
正确做法:
- 前端 key 名固定为
file(微信强制)
- 后端用
file, err := c.FormFile("file") 获取
*multipart.FileHeader
- 再用
c.SaveUploadedFile(file, "./uploads/" + file.Filename) 保存
- 注意:Gin 默认限制单个请求最大 32MB,如需上传大文件,启动前加
gin.SetMode(gin.ReleaseMode); r.MaxMultipartMemory = 1024 <p>小程序后台真正的难点不在框架启动,而在请求生命周期里每个环节都得对齐微信生态的硬约束——header 格式、token 传递方式、文件编码、错误码语义,漏掉任意一个,前端就卡在 loading 或静默失败。</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/xiazai/gongju/2602" title="Gin框架 1.9.0"><img
src="https://img.php.cn/upload/manual/001/589/237/6a731f5b72949207.png" alt="Gin框架 1.9.0" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/xiazai/gongju/2602" title="Gin框架 1.9.0">Gin框架 1.9.0</a>
<p>Gin框架 1.9.0版本源码包下载,版本号 1.9.0,适合需要 sonic JSON 支持、路由修复和内容协商改进的 Go Web 开发场景。</p>
</div>
<a href="/xiazai/gongju/2602" title="Gin框架 1.9.0" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div>