【问题标题】:getting error message along with result in go api在 go api 中收到错误消息以及结果
【发布时间】:2022-01-25 11:07:48
【问题描述】:

我在 API 中有一条路线,我可以通过roles 获取用户。在这条路线中,如果我输入用户名,那么我将获得分配给他/她的所有roles。但问题是它只返回第一个结果。如果该角色存在于另一个对象中,则不会显示该角色。所以我对return 行发表评论,一切正常,但随着结果,我收到错误消息:"user not found" 你们能告诉我我在做什么错误吗?
谢谢。
路线 -

GET("/users/:username", controllers.GetUserByRole)

控制器 -

func GetUserByRole(c *gin.Context) {
    paramId := c.Param("username")
    .............
    .............
    .............
    var newUsers []models.User
    iter := client.Collection("users").Documents(ctx)

    for {
        doc, err := iter.Next()
        if err == iterator.Done {
            break
        }
        if err != nil {
            log.Fatalf("Failed to iterate: %v", err)
        }

        var tempUsers models.User
        if err := doc.DataTo(&tempUsers); err != nil {
            break
        }
        newUsers = append(newUsers, tempUsers)
    }

    for _, a := range newUsers {
        for _, element := range a.Roles{
                if element == paramId {
            c.IndentedJSON(http.StatusOK, a)
            return     //if I comment this line line then I geting message `"user not found"` along with results
        }
    }
    }
    c.IndentedJSON(http.StatusNotFound, gin.H{"message": "user not found"})
}

网址:http://localhost:3000/users/Analyst
响应应该是:

  {
     "id": 1,
     "name": "Leanne Graham",
     "username": "Bret",
     "roles": ["Developer", "Analyst"],
  },
  {
    "id": 3,
    "name": "Clementine Bauch",
    "username": "Samantha",
    "roles": ["Manger", "Analyst"],
  }

但我是这样的(只有第一个匹配的):

  {
     "id": 1,
     "name": "Leanne Graham",
     "username": "Bret",
     "roles": ["Developer", "Analyst"],
  }

如果我评论 return 行,那么响应是(期望的结果 + 错误消息):

  {
     "id": 1,
     "name": "Leanne Graham",
     "username": "Bret",
     "roles": ["Developer", "Analyst"],
  },
  {
    "id": 3,
    "name": "Clementine Bauch",
    "username": "Samantha",
    "roles": ["Manger", "Analyst"],
  }{
    "message": "album not found"
}

完整的 API 响应 -

[
  {
     "id": 1,
     "name": "Leanne Graham",
     "username": "Bret",
     "roles": ["Developer", "Analyst"],
  },
  {
    "id": 2,
    "name": "Ervin Howell",
    "username": "Antonette",
    "roles": ["Assistant"],,
  },
  {
    "id": 3,
    "name": "Clementine Bauch",
    "username": "Samantha",
    "roles": ["Manger", "Analyst"],
  }
]

【问题讨论】:

    标签: api go google-cloud-firestore go-gin


    【解决方案1】:

    你可以这样做

    var userList []models.User
    for _, a := range newUsers {
        for _, element := range a.AssignedTo {
            if element == paramId {
                userList = append(userList, a)
            }
        }
    }
    if len(userList) == 0 {
         c.IndentedJSON(http.StatusNotFound, gin.H{"message": "user not found"})
         return
    }
    
    c.IndentedJSON(http.StatusOK, userList)
    

    【讨论】:

    • 修正错别字
    • 不。它不适合我
    • 你能告诉我你用上面的代码实现得到了什么吗?
    • 我在两个返回语句中都收到no result values expected 的错误
    • 只需从最后一行删除 return 关键字。它工作正常。而是 return c.IndentedJSON(http.StatusOK, userList) 这样做 c.IndentedJSON(http.StatusOK, userList)
    【解决方案2】:

    看起来你的 return 语句在你的 for 循环中,所以它找到第一个值并立即返回。当您将其注释掉时,您的函数不会返回,因此它成功完成,然后打印错误消息。将 return 语句移到两个 for 循环之外,应该没问题。此外,通过错误标志添加用于发送错误消息的逻辑。还建议使用 Manjeet Thakur 的替代解决方案。

    func GetUserByRole(c *gin.Context) {
        paramId := c.Param("username")
        .............
        .............
        .............
        var newUsers []models.User
        iter := client.Collection("users").Documents(ctx)
     
        for {
            doc, err := iter.Next()
            if err == iterator.Done {
                break
            }
            if err != nil {
                log.Fatalf("Failed to iterate: %v", err)
            }
     
            var tempUsers models.User
            if err := doc.DataTo(&tempUsers); err != nil {
                break
            }
            newUsers = append(newUsers, tempUsers)
        }
        var errorflag := 1
        for _, a := range newUsers {
            for _, element := range a.AssignedTo {
                    if element == paramId {
                c.IndentedJSON(http.StatusOK, a)
                errorflag := 0
                     //if I comment this line line then I geting message `"user not found"` along with results
            }
        }
        }
        if errorflag{
        c.IndentedJSON(http.StatusNotFound, gin.H{"message": "user not found"})
        }
        return
    }
    

    【讨论】:

    • 我这样写但是得到错误 - ``` for _, a := range newUsers { for _, element := range a.AssignedTo { if element == paramId { c.IndentedJSON( http.StatusOK, a) } return //错误-周围的循环被无条件终止 } } c.IndentedJSON(http.StatusNotFound, gin.H{"message": "user not found"}) ``
    • 我的错,你的 return 语句需要在你的内部和外部 for 循环之外,目前它在外部 for 循环内部、内部 for 循环内部和 if 块内部。此外,您的错误消息永远不会以这种方式发送,因为它只是循环通过用户并在他们匹配请求时发送他们,然后您的函数返回。您需要做的是检查是否没有与请求匹配的用户,如果为真则执行该错误消息。这是我对您正在尝试做的事情的理解。
    • 我已将 return 语句放在每一行,但它不起作用。因此,如果可能的话,如果您在答案中编写代码 sn-p,对我来说将是一件容易且容易理解的事情。
    • 我已经对其进行了编辑以向您展示我的意思。
    • 还要检查上面 Manjeet Thakur 的回答,虽然我相信最后一行应该是 return c.IndentedJSON(http.StatusOK, userList)
    猜你喜欢
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 2018-12-16
    • 2020-06-12
    相关资源
    最近更新 更多