我在 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"
}
完整的 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"],
}
]
uj5u.com熱心網友回復:
你可以這樣做
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)
uj5u.com熱心網友回復:
看起來你的 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
}
uj5u.com熱心網友回復:
這對我來說非常有效。
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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/393690.html
標籤:接口 去 谷歌云firestore 杜松子酒
下一篇:兩個gob編碼器產生不同的結果
