为了账号安全,请及时绑定邮箱和手机立即绑定

在 go api 中收到错误消息以及结果

在 go api 中收到错误消息以及结果

Go
回首忆惘然 2022-10-24 08:50:14
我在 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"})}URL: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"}
查看完整描述

2 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

你可以这样做


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)


查看完整回答
反对 回复 2022-10-24
?
BIG阳

TA贡献1859条经验 获得超6个赞

看起来你的 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

}


查看完整回答
反对 回复 2022-10-24
  • 2 回答
  • 0 关注
  • 77 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信