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.
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() }
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 }
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.
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 }
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!