l'éditeur php Baicao vous présente le problème : la librairie Golang ne peut rien renvoyer sauf zéro au contrôleur. Dans le développement Golang, le contrôleur est un composant clé dans le traitement des requêtes, mais vous pouvez parfois rencontrer le problème de ne pas pouvoir renvoyer un contenu autre que nul. Cela peut empêcher certaines fonctionnalités de fonctionner correctement. Heureusement, nous pouvons adopter certaines solutions pour résoudre ce problème et garantir que la bibliothèque restitue ce dont elle a besoin. Dans cet article, nous explorerons quelques solutions courantes pour vous aider à résoudre ce problème.
Je suis un enfant golang ici, donc je suppose qu'il me manque quelque chose d'évident. Après quelques jours d'essais, j'ai décidé de demander de l'aide. :-)
Le code que j'ai posté fonctionne sauf dans le cas où l'utilisateur demande la création d'un nouveau certificat/keybag client (il s'agit du webui de gestion du serveur openvpn) et qu'un client du même nom existe déjà. Même dans ce cas, le nouveau package client n'est pas créé, mais un message d'alerte erroné s'affiche indiquant qu'un nouveau package client a été créé.
Je sais que je dois repenser le contrôleur pour afficher une bannière d'alerte différente selon que le nom existe ou non. Cependant, j'ai été bloqué pour récupérer autre chose que "nil" de la bibliothèque.
Le code du contrôleur golang est le suivant :
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() }
Et les fonctions de bibliothèque appelées via 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 }
J'ai modifié chaque retour de la bibliothèque en err et inséré fmt.println(err) dans la deuxième instruction "else" du contrôleur, mais tout ce que j'obtiens est nul.
Ainsi, j'ai pu comprendre comment résoudre ce problème. Un peu plus de recherche sur Google et j'ai trouvé un article qui était au moins adjacent à ce que j'essayais de réaliser. Au final, je n'ai eu qu'à ajouter/modifier 3 lignes dans mon magasin de certificats. Je dois importer la bibliothèque "erreurs" dans newerror :=errors.new("error! there is already a valid or invalidcertificate for that name")
的形式添加自定义错误,并仅更改最后一个返回 return newerror
. J'ai appris une chose ou deux sur la façon dont Go gère les erreurs !
Voici le code mis à jour pour le magasin de certificats :
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 }
Maintenant, si j'essaie d'ajouter un client openvpn avec un nom qui existe déjà :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!