如果我的代码的任何部分返回 false,GO Gin 就会继续返回空状态

发布于 2025-01-13 20:40:30 字数 2621 浏览 0 评论 0原文

我对 Golang 和 Gin(框架)比较陌生,

我正在编写一些非常简单的 API 端点。但我注意到 Gin 有一些非常奇怪的地方,如果我的代码中有任何条件或函数返回 false,那么我的其余代码或条件不会被执行,而 Gin 只返回一个状态为空的 JSON:

{"status":""这

是一个非常简单的代码来解释我的意思

在一个functions.go文件中我有:

func VerifyUserLogin(username,password,userAgent string) (string, string) {
    userData := Users{}
    userQueryColumn := "username=?"
    // if they are trying to login with email
    if nEmailHelpers.EmailIsValid(username) == true{
        userQueryColumn = "email=?"
    }
    if getUserData := db.Select("password").Where(userQueryColumn, strings.ToLower(username)).First(&userData); getUserData.Error != nil {
        //  Meaning there was an error, most likely no data found , so we just return false todo improve this error handling later to handle more specific errors

        return "", feedback["InvalidLogin"]
    } else {
        if getUserData.RowsAffected == 1 {
            if nSecurityHelpers.CheckPasswordHash(password, userData.Password)==true {
                token, tokenError := CreateToken(username, userAgent, false, 60)
                if tokenError == nil {
                    return token, feedback["ValidLogin"]

                } else {
                    return "", feedback["TokenNotGenerated"]

                }
            } else {
                return "", feedback["InvalidLogin"]
            }
        }
        return "", feedback["InvalidLogin"]

    }
}

在另一个引用functions.go文件的go文件中我有:

func main(){
    router := gin.Default()
    router.POST ("login",loginUser)
    router.Run()
}

var feedback = userFeedback.Users()


// loginUser function to login a  user
func loginUser(c *gin.Context){
    requestBody := neielRequestsHelpers.RequestBody(c)
    username := requestBody["username"]
    password := requestBody["password"]
    userAgent := c.Request.Header.Get("User-Agent")
    token, loginMessage := userFunctions.VerifyUserLogin(username,password,userAgent)
    // todo come back and fix proper error message when user does not exist
    fmt.Println(loginMessage)
    if loginMessage==feedback["ValidLogin"]{
        c.JSON(http.StatusOK, gin.H{"status":loginMessage,"token":token})

    }else{
        c.JSON(http.StatusUnauthorized, gin.H{"status":feedback["InvalidLogin"]})

    }


}

如果我的所有输入都是正确的,那么一切都会顺利(用户名存在并且密码是正确的)。但我必须处理用户名或密码无效的情况。如果出于任何原因 getUserData 或 nSecurityHelpers.CheckPasswordHash() 为 false ,或者任何与此相关的函数返回 false 布尔值。整个函数只是终止,不允许我按照我想要的方式处理错误并输出自定义 JSON 响应。我刚刚得到这个 {"status":""}

我 100% 确定这个问题来自 Gin ,但我不知道要激活或停用什么才能让我自己处理错误。我已阅读文档,但显然我遗漏了一些东西。

请帮助我。

I am relatively new to Golang and Gin(framework)

I am writing some really simple API endpoints . But I notice something really weird about Gin, if there is any codition or function within my code that returns false the rest of my code or conditions does not get executed and Gin just returns a JSON with empty status :

{"status":""}

Here is a very simple code to explain what I mean

In a functions.go file I have :

func VerifyUserLogin(username,password,userAgent string) (string, string) {
    userData := Users{}
    userQueryColumn := "username=?"
    // if they are trying to login with email
    if nEmailHelpers.EmailIsValid(username) == true{
        userQueryColumn = "email=?"
    }
    if getUserData := db.Select("password").Where(userQueryColumn, strings.ToLower(username)).First(&userData); getUserData.Error != nil {
        //  Meaning there was an error, most likely no data found , so we just return false todo improve this error handling later to handle more specific errors

        return "", feedback["InvalidLogin"]
    } else {
        if getUserData.RowsAffected == 1 {
            if nSecurityHelpers.CheckPasswordHash(password, userData.Password)==true {
                token, tokenError := CreateToken(username, userAgent, false, 60)
                if tokenError == nil {
                    return token, feedback["ValidLogin"]

                } else {
                    return "", feedback["TokenNotGenerated"]

                }
            } else {
                return "", feedback["InvalidLogin"]
            }
        }
        return "", feedback["InvalidLogin"]

    }
}

In another go file that references the functions.go file I have :

func main(){
    router := gin.Default()
    router.POST ("login",loginUser)
    router.Run()
}

var feedback = userFeedback.Users()


// loginUser function to login a  user
func loginUser(c *gin.Context){
    requestBody := neielRequestsHelpers.RequestBody(c)
    username := requestBody["username"]
    password := requestBody["password"]
    userAgent := c.Request.Header.Get("User-Agent")
    token, loginMessage := userFunctions.VerifyUserLogin(username,password,userAgent)
    // todo come back and fix proper error message when user does not exist
    fmt.Println(loginMessage)
    if loginMessage==feedback["ValidLogin"]{
        c.JSON(http.StatusOK, gin.H{"status":loginMessage,"token":token})

    }else{
        c.JSON(http.StatusUnauthorized, gin.H{"status":feedback["InvalidLogin"]})

    }


}

If all my inputs are correct , all goes well (Username exists and password is correct). But I have to handle scenario where username or password is invalid .If for any reason getUserData or nSecurityHelpers.CheckPasswordHash() is false , or any function for that matter returns a boolean of false . The entire function just terminates and doesn't allow me handle the error the way I want and output custom JSON response. I just get this {"status":""}

I am 100% sure this issue is from Gin , but I don't know what to activate or deactivate to allow me handle errors on my own. I have read the docs, but its obvious I am missing something .

Kindly help me please .

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

喵星人汪星人 2025-01-20 20:40:30

我已经解决了这个问题,感谢所有试图提供帮助的人
这是一个拼写错误,导致问题“InValidLogin”而不是另一个文件中的“InvalidLogin”。
真的很微妙

I have resolved this, thanks to everyone that tried to help
It was a typo error causing the issue "InValidLogin" instead of "InvalidLogin" in another file.
It was really subtle

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文