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