簡體   English   中英

無法讓 Golang 庫將 nil 以外的任何內容返回給控制器

[英]Can't get Golang library to return anything but nil to controller

Golang 幼兒在這里,所以我想我錯過了一些明顯的東西。 不過,經過幾天的試驗后,我決定尋求幫助。 :-)

我發布的代碼是有效的,除了用戶請求創建新的客戶端證書/密鑰包(這是一個 OpenVPN 服務器管理 WebUI)的情況,當同名的客戶端已經存在時。 即使在那種情況下,也不會創建新的客戶端包,但會顯示一條不正確的警報消息,表明它已經創建。

我知道我需要根據名稱是否存在來重新設計控制器以顯示不同的警報橫幅。 但是,我堅持要從圖書館取回“nil”以外的任何東西。

Golang控制器代碼如下:

    func (c *CertificatesController) Post() {
    c.TplName = "certificates.html"
    flash := beego.NewFlash()

    cParams := NewCertParams{}
    if err := c.ParseForm(&cParams); err != nil {
        beego.Error(err)
        flash.Error(err.Error())
        flash.Store(&c.Controller)
    } else {
        if vMap := validateCertParams(cParams); vMap != nil {
            c.Data["validation"] = vMap
        } else {
            if err := lib.CreateCertificate(cParams.Name, cParams.Passphrase); err != nil {
                beego.Error(err)
                flash.Error(err.Error())
                flash.Store(&c.Controller)
            } else {
                fmt.Println(err)
                flash.Success("Certificate for the name \"" + cParams.Name + "\" created")
                flash.Store(&c.Controller)
            }
        }
    }
    c.showCerts()
}

以及通過 lib.CreateCertificate 調用的庫函數:

    func CreateCertificate(name string, passphrase string) error {
    rsaPath := models.GlobalCfg.OVConfigPath + "easy-rsa"
    rsaIndex := models.GlobalCfg.OVConfigPath + "easy-rsa/pki/index.txt"
    pass := false
    if passphrase != "" {
        pass = true
    }
    certs, err := ReadCerts(rsaIndex)
    if err != nil {
        //      beego.Debug(string(output))
        beego.Error(err)
        //      return err
    }
    Dump(certs)
    exists := false
    for _, v := range certs {
        if v.Details.Name == name {
            exists = true
        }
    }
    if !exists && !pass {
        cmd := exec.Command("/bin/bash", "-c",
            fmt.Sprintf(
                "%s/easyrsa --batch build-client-full %s nopass",
                rsaPath, name))
        cmd.Dir = models.GlobalCfg.OVConfigPath
        output, err := cmd.CombinedOutput()
        if err != nil {
            beego.Debug(string(output))
            beego.Error(err)
            return err
        }
        return nil
    }
    if !exists && pass {
        cmd := exec.Command("/bin/bash", "-c",
            fmt.Sprintf(
                "%s/easyrsa --passout=pass:%s build-client-full %s",
                rsaPath, passphrase, name))
        cmd.Dir = models.GlobalCfg.OVConfigPath
        output, err := cmd.CombinedOutput()
        if err != nil {
            beego.Debug(string(output))
            beego.Error(err)
            return err
        }
        return nil
    }
    if exists {
        return err
    }
    return err
}

我已經將庫中的每個返回更改為 err,並在控制器的第二個“else”語句中插入 fmt.Println(err),但 nil 是我得到的所有結果。

所以,我能夠弄清楚如何處理這個問題。 再谷歌一下,我發現了一個至少與我想要完成的目標相鄰的帖子。 最后,我只需要在我的證書庫中添加/更改 3 行。 我需要導入“錯誤”庫,以newError:= errors.New("Error! There is already a valid or invalid certificate for that name")的形式添加自定義錯誤,並僅將最后一次返回更改為return newError 我確實學到了關於 Go 如何處理錯誤的一兩件事!

這是證書庫的更新代碼:

    func CreateCertificate(name string, passphrase string) error {
    rsaPath := models.GlobalCfg.OVConfigPath + "easy-rsa"
    rsaIndex := models.GlobalCfg.OVConfigPath + "easy-rsa/pki/index.txt"
    pass := false
    newError := errors.New("Error! There is already a valid or invalid certificate for that name")
    if passphrase != "" {
        pass = true
    }
    certs, err := ReadCerts(rsaIndex)
    if err != nil {
        //      beego.Debug(string(output))
        beego.Error(err)
        //      return err
    }
    Dump(certs)
    exists := false
    for _, v := range certs {
        if v.Details.Name == name {
            exists = true
        }
    }
    if !exists && !pass {
        cmd := exec.Command("/bin/bash", "-c",
            fmt.Sprintf(
                "%s/easyrsa --batch build-client-full %s nopass",
                rsaPath, name))
        cmd.Dir = models.GlobalCfg.OVConfigPath
        output, err := cmd.CombinedOutput()
        if err != nil {
            beego.Debug(string(output))
            beego.Error(err)
            return err
        }
        return nil
    }
    if !exists && pass {
        cmd := exec.Command("/bin/bash", "-c",
            fmt.Sprintf(
                "%s/easyrsa --passout=pass:%s build-client-full %s",
                rsaPath, passphrase, name))
        cmd.Dir = models.GlobalCfg.OVConfigPath
        output, err := cmd.CombinedOutput()
        if err != nil {
            beego.Debug(string(output))
            beego.Error(err)
            return err
        }
        return nil
    }
    return newError
}

現在,如果我嘗試添加一個名稱已經存在的 OpenVPN 客戶端:

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM