Maison > développement back-end > Golang > le corps du texte

Il n'y a aucun moyen pour que la bibliothèque Golang renvoie autre chose que zéro au contrôleur

王林
Libérer: 2024-02-11 15:45:09
avant
723 Les gens l'ont consulté

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

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.

Contenu de la question

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()
}
Copier après la connexion

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
}
Copier après la connexion

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.

Solution

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
}
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!