fish2018/pansou · error
username cannot be empty
Error message
username cannot be empty
What it means
GenerateToken validates its inputs before signing a JWT: an empty username is rejected because the resulting token would carry no usable identity. It returns a plain sentinel error before any claims are built.
Solutions
- Validate the login request body before calling GenerateToken and return 400 for empty username
- Check LoginHandler binding: ensure the username field is required (binding:"required" on the struct)
- Log the incoming request to confirm the field name matches what the client sends
Example fix
// before
token, err := util.GenerateToken(req.Username, secret, expiry)
// after
if strings.TrimSpace(req.Username) == "" {
c.JSON(400, gin.H{"error": "username is required"})
return
}
token, err := util.GenerateToken(req.Username, secret, expiry) Defensive patterns
Strategy: validation
Validate before calling
if strings.TrimSpace(username) == "" { return errors.New("username required") } Try / catch
token, err := util.GenerateToken(username, secret, expiry)
if err != nil {
http.Error(w, "invalid login input", 400)
return
} Prevention
- Mark username required in request binding structs
- Trim whitespace before calling GenerateToken
- Return 400 for empty login fields
When it happens
Trigger: Calling util.GenerateToken("", secret, expiry), typically from LoginHandler when the login request body had an empty/missing username field.
Common situations: Client POSTs login JSON without the username field; frontend sends empty string; request binding defaults zero value; DB lookup returned an empty username.
Understand the failure class
Background: "must not be empty", "cannot be empty" — required-field validation errors across open-source libraries — this error's family across 41 libraries.
Related errors
AI-assisted analysis of fish2018/pansou@beaa561337 (2026-09-07).
Data as JSON: /api/errors/ed4935d65985fba4.
Report an issue: GitHub.
Appendix: source
Thrown at util/jwt.go:19
package util
import (
"errors"
"time"
"github.com/golang-jwt/jwt/v5"
)
// Claims JWT载荷结构
type Claims struct {
Username string `json:"username"`
jwt.RegisteredClaims
}
// GenerateToken 生成JWT token
func GenerateToken(username string, secret string, expiry time.Duration) (string, error) {
if username == "" {
return "", errors.New("username cannot be empty")
}
if secret == "" {
return "", errors.New("secret cannot be empty")
}
expirationTime := time.Now().Add(expiry)
claims := &Claims{
Username: username,
RegisteredClaims: jwt.RegisteredClaims{
ExpiresAt: jwt.NewNumericDate(expirationTime),
IssuedAt: jwt.NewNumericDate(time.Now()),
Issuer: "pansou",
},
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
return token.SignedString([]byte(secret))
}View on GitHub (pinned to beaa561337)