Die Golang-Bibliothek kann nicht dazu gebracht werden, etwas anderes als Null an den Controller zurückzugeben

王林
Freigeben: 2024-02-11 15:45:09
nach vorne
723 Leute haben es durchsucht

无法让 Golang 库向控制器返回除 nil 之外的任何内容

php-Editor Baicao stellt Ihnen das Problem vor: Die Golang-Bibliothek kann nichts außer Null an den Controller zurückgeben. In der Golang-Entwicklung ist der Controller eine Schlüsselkomponente bei der Bearbeitung von Anfragen, aber manchmal kann es vorkommen, dass Sie keinen anderen Inhalt als Null zurückgeben können. Dies kann dazu führen, dass einige Funktionen nicht ordnungsgemäß funktionieren. Glücklicherweise gibt es einige Lösungen, mit denen wir dieses Problem lösen und sicherstellen können, dass die Bibliothek das zurückgibt, was sie benötigt. In diesem Artikel untersuchen wir einige gängige Lösungen, die Ihnen bei der Lösung dieses Problems helfen.

Frageninhalt

Ich bin hier ein Golang-Kind, also übersehe ich wohl etwas Offensichtliches. Nachdem ich es ein paar Tage lang versucht hatte, beschloss ich, mir Hilfe zu holen. :-)

Der von mir gepostete Code funktioniert, außer in dem Fall, in dem der Benutzer die Erstellung eines neuen Client-Zertifikats/Keybags anfordert (dies ist die WebUI für die OpenVPN-Serververwaltung) und bereits ein Client mit demselben Namen vorhanden ist. Auch in diesem Fall wird das neue Client-Paket nicht erstellt, sondern es wird eine fehlerhafte Warnmeldung angezeigt, die darauf hinweist, dass ein neues Client-Paket erstellt wurde.

Ich weiß, dass ich den Controller neu gestalten muss, um ein anderes Warnbanner anzuzeigen, je nachdem, ob der Name existiert oder nicht. Ich bin jedoch beim Abrufen von etwas anderem als „Null“ aus der Bibliothek steckengeblieben.

Der Golang-Controller-Code lautet wie folgt:

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()
}
Nach dem Login kopieren

Und Bibliotheksfunktionen, die über lib.createcertificate aufgerufen werden:

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
}
Nach dem Login kopieren

Ich habe jede Rückgabe in der Bibliothek in err geändert und fmt.println(err) in die zweite „else“-Anweisung des Controllers eingefügt, aber alles, was ich bekomme, ist Null.

Lösung

So konnte ich herausfinden, wie ich mit diesem Problem umgehen kann. Noch ein bisschen googeln und ich fand einen Beitrag, der zumindest dem entsprach, was ich erreichen wollte. Am Ende musste ich in meinem Zertifikatsspeicher nur 3 Zeilen hinzufügen/ändern. Ich muss die „errors“-Bibliothek nach newerror :=errors.new("error! there is already a valid or invalidcertificate for that name") 的形式添加自定义错误,并仅更改最后一个返回 return newerror importieren. Ich habe ein oder zwei Dinge darüber gelernt, wie Go mit Fehlern umgeht!

Das Folgende ist der aktualisierte Code für den Zertifikatsspeicher:

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
}
Nach dem Login kopieren

Wenn ich jetzt versuche, einen OpenVPN-Client mit dem bereits vorhandenen Namen hinzuzufügen:

Das obige ist der detaillierte Inhalt vonDie Golang-Bibliothek kann nicht dazu gebracht werden, etwas anderes als Null an den Controller zurückzugeben. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!