将数据从数据存储传递到http.Writer

时间:2019-01-26 22:00:37

标签: go google-cloud-firestore google-cloud-datastore

最近向我介绍了一种叫做 go 的语言的奇妙之处。我设定了使用GoLang和Google的数据存储区编写RESTful API的任务。我可以从数据存储中检索数据,并使用fmt.Println将其打印到控制台,但是当我尝试使用数据存储中的数据并将其传递给 http.Handler 时,问题就开始了。

我想知道是否有人可以告诉我我要去哪里,或者甚至指向正确的方向。

这是我到目前为止所做的

 package main

 import (
    "log"
    "fmt"
    "context"
    "net/http"
 // "encoding/json"
    "cloud.google.com/go/datastore"
 )

 type Item struct {
      Id       string   `datastore:"id"`
      Name     string   `datastore:"title"`
      View     int      `datastore:"views"`
      Brand    string   `datastore:"brand"`
      id    int64   // interger from "Name/ID" fild in datastore entities list
 }

 func main() {
     http.HandleFunc("/", ListTasks)
     http.ListenAndServe(":8080", nil)
 }

 //func ListTasks(w http.ResponseWriter, r *http.Request) ([]*Item, error)     {
func ListTasks(w http.ResponseWriter, r *http.Request) {
    ctx := context.Background()

    client, err := datastore.NewClient(ctx, "my-client")
    if err != nil {
        log.Fatalln(err)
    }

    var tasks []*Item

    query := datastore.NewQuery("my-query")
    keys, err := client.GetAll(ctx, query, &tasks)
    if err != nil {
        return nil, err
    }

    for i, key := range keys {
        tasks[i].id = key.ID
    }

    return tasks, nil
}

我也研究了http Wrappers,但是我不知道是否有必要100%使用包装器,或者只是在盘子中添加更多内容。

1 个答案:

答案 0 :(得分:1)

我删除了return tasks, nil,因为它似乎不必要了,将return, nil err修改为log.Fatalln(nil, err),并按照@ThunderCat和@tkausl的指示对tasks进行了编码。我的问题已经解决,谢谢。

这是我的工作代码

package main

import (
    "log"
    "context"
    "net/http"
    "encoding/json"
    "cloud.google.com/go/datastore"
)

type Item struct {
    Id      string  `datastore:"id"`
    Name    string  `datastore:"title"`
    View    int     `datastore:"views"`
    Brand   string  `datastore:"brand"`
    id  int64   // interger from "Name/ID" fild in datastore entities list
}

func main() {
    http.HandleFunc("/", ListTasks)
    http.ListenAndServe(":8080", nil)
}

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

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

    ctx := context.Background()

    client, err := datastore.NewClient(ctx, "my-client")
    if err != nil {
        log.Fatalln(err)
    }

    var tasks []*Item

    query := datastore.NewQuery("my-query")
    keys, err := client.GetAll(ctx, query, &tasks)
    if err != nil {
        log.Fatalln(nil, err)
    }
    for i, key := range keys {
        tasks[i].id = key.ID
    }

    json.NewEncoder(w).Encode(tasks)
//  return tasks, nil
}

它现在返回[{"Id":"24X660","Name":"Fiesta","View":129,"Brand":"Ford"}]

也感谢@static_cast纠正我的格式错误。