首页 > 解决方案 > 将数据从 Datastore 传递到 http.Writer

问题描述

我最近被介绍到称为go的语言的奇迹。我给自己设定了一项任务,即使用 GoLang 和 Google 的 Datastore 编写一个 RESTful API。我能够从 Datastore 检索数据并将其打印到控制台,fmt.Println但是当我尝试使用 Datastore 中的数据并将其传递给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% 需要使用包装器,或者我只是在我的盘子中添加更多。

标签: gogoogle-cloud-firestoregoogle-cloud-datastore

解决方案


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

这是我的工作代码

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 纠正我的格式错误。


推荐阅读