【问题标题】:Go chi renderer having difficult processing bound listsGo chi 渲染器难以处理绑定列表
【发布时间】:2020-06-22 11:44:12
【问题描述】:

去这里。试图让 chi 渲染器返回 Order 结构实例的列表并得到一个我不明白的编译器错误:

package myapp

import (
    "net/http"
    "github.com/go-chi/render"
)

type Order struct {
    OrderId    string
  Status     string
}

func (*Order) Bind(r *http.Request) error {
    return nil
}

func GetAllOrderByCustomerId(dbClient DbClient, customerId string) http.HandlerFunc {
  return func(w http.ResponseWriter, r *http.Request) {

    // fetch all customer orders from the DB
    orders,err := dbClient.FetchAllOrdersByCustomerId(customerId)
    if err != nil {
      log.Error("unable to fetch orders for customer", err)
      render.Render(w, r, NewInternalServerError(err))
      return
    }

    render.Bind(r, &orders)
    return

  }
}

当我去编译这段代码时,我得到:

fizz/buzz/myapp/order_fetcher.go:136:20: cannot use &orders (type *[]Order) as type render.Binder in argument to render.Bind:
    *[]Order does not implement render.Binder (missing Bind method)

因此,即使我为Order 定义了Bind,它似乎也不会自动将Bind 应用到Orders 的集合/列表中。

谁能看到我错过了什么?一些端点只会返回一个 Order,而其他端点(比如这个)需要能够返回 Orders 的集合/列表。

【问题讨论】:

    标签: go compiler-errors go-chi


    【解决方案1】:

    chi 存储库中的示例一样,您必须创建一个辅助方法来呈现某些东西的列表,在您的情况下,列表订单。

    首先,您必须实现render.Renderer 方法,然后创建一个帮助方法来构建render.Renderer 的列表。

    我已经根据示例 here 改编了您的代码:

    type Order struct {
        OrderId string
        Status  string
    }
    
    // Render implement render.Renderer
    func (*Order) Render(w http.ResponseWriter, r *http.Request) error {
        // do something
        return nil
    }
    
    // newOrderList is a helper method to make list of render.Renderer
    func newOrderList(orders []*Order) []render.Renderer {
        list := []render.Renderer{}
        for _, order := range orders {
            list = append(list, order)
        }
        return list
    }
    
    func GetAllOrderByCustomerId(dbClient DbClient, customerId string) http.HandlerFunc {
        return func(w http.ResponseWriter, r *http.Request) {
    
            // fetch all customer orders from the DB
            orders, err := dbClient.FetchAllOrdersByCustomerId(customerId)
            if err != nil {
                log.Error("unable to fetch orders for customer", err)
                render.Render(w, r, NewInternalServerError(err))
                return
            }
    
            // render list of orders
            render.RenderList(w, r, newOrderList(orders))
            return
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-07
      • 2017-07-10
      • 2011-10-14
      • 2018-01-17
      相关资源
      最近更新 更多