postgresqlgojwtgo-gormfibers

got error unsupported data type: &[]. this is gorm model + golang/jwt


Your Question

Hello
good day

System specs

Am trying to run AutoMigrate but am having an error, everything was working fine but since last week i get the following error when i run my code.

2021/12/30 13:17:56 ←[35mC:/personal/projects/uni-blog/src/database/connect.go:43
←[0m←[31m[error] ←[0munsupported data type: &[]

2021/12/30 13:17:56 ←[35mC:/personal/projects/uni-blog/src/database/connect.go:43
←[0m←[31m[error] ←[0mfailed to parse value &models.Claims{RegisteredClaims:jwt.RegisteredClaims{Issuer:"", Subject:"", Audience:jwt.ClaimStrings(nil), ExpiresAt:<nil>, NotBefore:<nil>, IssuedAt:<nil>, ID:""}, ID:uuid.UUID{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}, got error unsupported data type: &[]

2021/12/30 13:17:56 ←[35mC:/Users/raliq/go/pkg/mod/gorm.io/driver/postgres@v1.1.2/migrator.go:192
←[0m←[31m[error] ←[0munsupported data type: &[]

2021/12/30 13:17:56 ←[35mC:/Users/raliq/go/pkg/mod/gorm.io/driver/postgres@v1.1.2/migrator.go:167
←[0m←[31m[error] ←[0munsupported data type: &[]

2021/12/30 13:17:56 ←[35mC:/Users/raliq/go/pkg/mod/gorm.io/driver/postgres@v1.1.2/migrator.go:167
←[0m←[31m[error] ←[0mfailed to parse value &models.Claims{RegisteredClaims:jwt.RegisteredClaims{Issuer:"", Subject:"", Audience:jwt.ClaimStrings(nil), ExpiresAt:<nil>, NotBefore:<nil>, IssuedAt:<nil>, ID:""}, ID:uuid.UUID{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}, got error unsupported data type: &[]

2021/12/30 13:17:56 ←[35mC:/Users/raliq/go/pkg/mod/gorm.io/driver/postgres@v1.1.2/migrator.go:167
←[0m←[31m[error] ←[0munsupported data type: &[]
Sorry couldn't migrate'...
Database connection was successful...

this is my code and the model where the problem appears, because it migrates the user model then it gets stuck at claims

DBConnection

var DB *gorm.DB

func ConnectPg() {
    p := config.Config("DB_PORT")
    port, err := strconv.Atoi(p)
    // port, err := strconv.ParseUint(p, 10, 32)
    if err != nil {
        log.Println("Sorry db port error: ", err)
    }

    // connection url to DB
    dns := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", config.Config("DB_HOST"), port, config.Config("DB_USER"), config.Config("DB_PASSWORD"), config.Config("DB_NAME"))

    // connect to DB
    var dbErr error
    DB, dbErr = gorm.Open(postgres.Open(dns), &gorm.Config{})

    if dbErr != nil {
        panic("failed to connect to database..")
    }

    fmt.Println("Running the migrations...")

    if migrateErr := DB.AutoMigrate(&models.User{}, &models.Claims{}, &models.Permission{}, &models.Role{}, &models.RolePermission{}, &models.SessionLog{}); migrateErr != nil {
        fmt.Println("Sorry couldn't migrate'...")
    }

    fmt.Println("Database connection was successful...")
}
Claims model

package models

import (
    "github.com/golang-jwt/jwt/v4"
    "github.com/google/uuid"
)

type Claims struct {
    jwt.RegisteredClaims
    ID uuid.UUID `gorm:"type:uuid;default:uuid_generate_v4()"`
}

Here is the original code before i migrated to https://github.com/golang-jwt/jwt from https://github.com/dgrijalva/jwt-go. here is the repo i just want to do the same thing as before but its not working.

I changed jwt packages using the golang/jwt v4 now am trying to migrate my code to work with the new change but something is wrong in the models. I want to generate jwt token for access and refresh tokens

please help

Thanks in advance How i used it to save the audience enter image description here


Solution

  • The Scanner/Valuer interface is not implemented for slice types ie []string. So you can use the pq.StringArray type from https://pkg.go.dev/github.com/lib/pq instead of the []string type in the jwt.RegisteredClaims struct. You can use a custom struct that have the same fields but with the pq.StringArray type instead of []string.