在 Go api 中接收不一致的数据

我正在学习Go语言,并使用go + 谷歌火库作为数据库测试了谷歌云功能。


当我测试响应时,我得到了不一致的响应。


我使用 json 编组器将 Firebase 数据转换为 Json 对象以从 API 返回,此 API 托管在 Google 云函数中。


// Package p contains an HTTP Cloud Function.

package p


import (

    "context"

    "fmt"

    "log"

    "net/http"


    s "strings"


    "encoding/json"


    "cloud.google.com/go/firestore"

    "google.golang.org/api/iterator"

)



func HelloWorld(w http.ResponseWriter, r *http.Request) {

    path := s.Replace(r.URL.Path, "/", "", -1)


    ctx := context.Background()

    client := createClient(ctx)


    iter := client.Collection("profile").Where("publicUrl", "==", path).Documents(ctx)

    for {

        doc, err := iter.Next()

        if err == iterator.Done {

            break

        }

        var publicDTO PublicDTO

        var Profile Profile

        doc.DataTo(&Profile)


        publicDTO.Profile = Profile


        b, err := json.Marshal(publicDTO)

        if err != nil {

            fmt.Println(err)

            return

        }


        w.Header().Set("Content-Type", "application/json")

        w.Write(b)

    }


}


func createClient(ctx context.Context) *firestore.Client {

    projectID := "projectId"


    client, err := firestore.NewClient(ctx, projectID)

    if err != nil {

        log.Fatalf("Failed to create client: %v", err)

    }

    return client

}


type PublicDTO struct {

    Profile       Profile     `json:"profile"`

}


type Profile struct {

    Id           string            `json:"id"`

    FirstName    string            `json:"firstName"`

    LastName     string            `json:"lastName"`

    FullName     string            `json:"fullName"`

    Email        string            `json:"email"`

    ImageUrl     string            `json:"imageUrl"`

    CoverPic     string            `json:"coverPic"`

    Experience   int               `json:"experience"`

    PhoneNumber  string            `json:"phoneNumber"`


}


但是每次我得到的响应不一致时,一些值都丢失了。


宝慕林4294392
浏览 107回答 1
1回答

守着星空守着你

我在元帅和解帅之后得到的解决方案,它按预期工作。package pimport (    "context"    "encoding/json"    "fmt"    "log"    "net/http"    s "strings"    "time"    "cloud.google.com/go/firestore"    "google.golang.org/api/iterator")var ctx context.Contextvar client *firestore.Clientfunc PublicApi(w http.ResponseWriter, r *http.Request) {    path := s.Replace(r.URL.Path, "/", "", -1)    w.Header().Set("Content-Type", "application/json")    w.Header().Set("Access-Control-Allow-Origin", "*")    w.Header().Set("Access-Control-Allow-Headers", "*")    newFsConfigBytes, _ := json.Marshal(getPublicDTO(path))    w.Write(newFsConfigBytes)}func getPublicDTO(path string) (publicDTO publicDTO) {    ctx = context.Background()    client = createClient()    profile, id := getProfiles(path)    publicDTO.Profile = profile    publicDTO.MilestoneDTOS = getMilestone(id)    return}func getProfiles(link string) (profile, string) {    var retVal profile    var id string    iter := client.Collection("profile").Where("publicUrl", "==", link).Documents(ctx)    for {        doc, err := iter.Next()        if err == iterator.Done {            break        }        id = doc.Ref.ID        b, _ := json.Marshal(doc.Data())        json.Unmarshal(b, &retVal)    }    return retVal, id}func getMilestone(id string) []milestoneDTOS {    var retVal []milestoneDTOS    iter := client.Collection("milestone").Where("userId", "==", id).Documents(ctx)    for {        var milestoneDTO milestoneDTOS        doc, err := iter.Next()        if err == iterator.Done {            break        }        b, _ := json.Marshal(doc.Data())        err = json.Unmarshal(b, &milestoneDTO)        if err != nil {            fmt.Println(err)        }        retVal = append(retVal, milestoneDTO)    }    return retVal}func createClient() *firestore.Client {    projectID := "live-hiveboard"    client, err := firestore.NewClient(ctx, projectID)    if err != nil {        log.Fatalf("Failed to create client: %v", err)    }    return client}type profile struct {    Address          string    `json:"address"`    City             string    `json:"city"`    Country          string    `json:"country"`    CoverPic         string    `json:"coverPic"`    CreatedBy        string    `json:"createdBy"`    CreatedDate      int       `json:"createdDate"`    Description      string    `json:"description"`    Dob              int64     `json:"dob"`    Email            string    `json:"email"`    Enabled          bool      `json:"enabled"`    Experience       int       `json:"experience"`    FirstName        string    `json:"firstName"`    FullName         string    `json:"fullName"`    FullNameNoSpace  string    `json:"fullNameNoSpace"`    ImageURL         string    `json:"imageUrl"`    Interests        []string  `json:"interests"`    IsEnabled        bool      `json:"isEnabled"`    Language         string    `json:"language"`    LastModifiedDate int       `json:"lastModifiedDate"`    LastName         string    `json:"lastName"`    LatLng           string    `json:"latLng"`    MemberFrom       time.Time `json:"memberFrom"`    ObjectID         string    `json:"objectID"`    Organization     string    `json:"organization"`    PhoneNumber      string    `json:"phoneNumber"`    PlanID           string    `json:"planId"`    PublicURL        string    `json:"publicUrl"`    Reputation       int       `json:"reputation"`    Setup            int       `json:"setup"`    Social           string    `json:"social"`    State            string    `json:"state"`    Status           string    `json:"status"`    Title            string    `json:"title"`    Website          string    `json:"website"`}type milestoneDTOS struct {    Category          string    `json:"category"`    CreatedBy         string    `json:"createdBy"`    CreatedDate       int       `json:"createdDate"`    Description       string    `json:"description"`    Enabled           bool      `json:"enabled"`    EndDate           time.Time `json:"endDate"`    IsCurrentPosition bool      `json:"isCurrentPosition"`    IsEnabled         bool      `json:"isEnabled"`    LastModifiedBy    time.Time `json:"lastModifiedBy"`    LastModifiedDate  int       `json:"lastModifiedDate"`    ObjectID          string    `json:"objectID"`    Organization      string    `json:"organization"`    PictureURL        string    `json:"pictureURL"`    Profile           string    `json:"profile"`    Score             float64   `json:"score"`    StartDate         time.Time `json:"startDate"`    Tags              []string  `json:"tags"`    Title             string    `json:"title"`    URL               string    `json:"url"`    UserID            string    `json:"userId"`}type publicDTO struct {    Profile       profile         `json:"profile"`    MilestoneDTOS []milestoneDTOS `json:"milestoneDTOS"`}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go