Tidak boleh mendapatkan pustaka Golang untuk mengembalikan apa-apa selain nil kepada pengawal

王林
Lepaskan: 2024-02-11 15:45:09
ke hadapan
723 orang telah melayarinya

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

editor php Baicao memperkenalkan anda kepada masalah: perpustakaan Golang tidak boleh mengembalikan apa-apa kecuali tiada kepada pengawal. Dalam pembangunan Golang, pengawal ialah komponen utama dalam mengendalikan permintaan, tetapi kadangkala anda mungkin menghadapi masalah tidak dapat mengembalikan kandungan selain daripada tiada. Ini boleh menyebabkan beberapa ciri tidak berfungsi dengan betul. Nasib baik, terdapat beberapa penyelesaian yang boleh kami ambil untuk menyelesaikan masalah ini dan memastikan perpustakaan mengembalikan apa yang diperlukannya. Dalam artikel ini, kami akan meneroka beberapa penyelesaian biasa untuk membantu anda menyelesaikan isu ini.

Isi soalan

Saya budak golang di sini, jadi saya rasa saya kehilangan sesuatu yang jelas. Selepas beberapa hari mencuba, saya memutuskan untuk mendapatkan bantuan. :-)

Kod yang saya siarkan berfungsi kecuali dalam kes di mana pengguna meminta penciptaan sijil/beg kunci pelanggan baharu (ini ialah webui pengurusan pelayan openvpn) dan pelanggan dengan nama yang sama sudah wujud. Walaupun dalam kes ini, pakej pelanggan baharu tidak dibuat, tetapi mesej amaran yang salah dipaparkan yang menunjukkan bahawa pakej pelanggan baharu telah dibuat.

Saya tahu saya perlu mereka bentuk semula pengawal untuk menunjukkan sepanduk amaran yang berbeza bergantung pada sama ada nama itu wujud atau tidak. Walau bagaimanapun, saya telah terjebak untuk mendapatkan apa-apa selain daripada "tiada" dari perpustakaan.

Kod pengawal golang adalah seperti berikut:

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()
}
Salin selepas log masuk

Dan fungsi perpustakaan dipanggil melalui 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
}
Salin selepas log masuk

Saya telah menukar setiap pemulangan dalam perpustakaan kepada ralat dan memasukkan fmt.println(err) dalam pernyataan "lain" kedua pengawal, tetapi yang saya dapat hanyalah sifar.

Penyelesaian

Jadi, saya dapat memikirkan cara untuk menangani masalah ini. Sedikit lagi Googling dan saya menemui siaran yang sekurang-kurangnya bersebelahan dengan perkara yang saya cuba capai. Akhirnya, saya hanya perlu menambah/menukar 3 baris di kedai sijil saya. Saya perlu mengimport perpustakaan "ralat" ke newerror :=errors.new("error! there is already a valid or invalidcertificate for that name") 的形式添加自定义错误,并仅更改最后一个返回 return newerror . Saya memang belajar satu atau dua perkara tentang cara go menangani ralat!

Berikut ialah kod yang dikemas kini untuk kedai sijil:

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
}
Salin selepas log masuk

Sekarang jika saya cuba menambah klien openvpn dengan nama yang sudah ada:

Atas ialah kandungan terperinci Tidak boleh mendapatkan pustaka Golang untuk mengembalikan apa-apa selain nil kepada pengawal. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!