我正在尝试在 golang 中重写一个小的 node-api,在那里我发现内部错误并没有停止处理请求。有没有好的方法来结束处理?
我尝试了不同的方法,例如创建错误对象和使用 panic(err) 退出处理,但我认为有更好的方法。
我期望有一个函数可以停止处理请求并抛出 500 错误,并且可能会记录一两件事。
代码示例是这样的:
package main
import (
"fmt"
"net/http"
"strings"
)
func main() {
http.HandleFunc("/ping/", ping)
err := http.ListenAndServe(":8080", nil)
checkErr(err)
}
func ping(w http.ResponseWriter, req *http.Request) {
w.Write([]byte("pong\n"))
urlPath := req.URL.Path
rest := strings.TrimPrefix(urlPath, "/ping/")
testRest(w, rest)
}
func testRest(w http.ResponseWriter, rest string) {
if rest == "abc" {
http.Error(w, "The go-routine should stop here", 500)
}
fmt.Print("This shouldn't be printed")
}
func checkErr(err error) {
if err != nil {
panic(err)
}
}
Run Code Online (Sandbox Code Playgroud)
我这样称呼它:
curl --url http://127.0.0.1:8080/ping/abc
Run Code Online (Sandbox Code Playgroud)
没有什么诀窍。当您希望处理程序函数停止执行操作时,只需从函数返回:
func testRest(w http.ResponseWriter, rest string) {
if rest == "abc" {
http.Error(w, "The go-routine should stop here", 500)
return
}
fmt.Print("This shouldn't be printed")
}
Run Code Online (Sandbox Code Playgroud)
如果你想记录一些东西,记录一些东西:
func testRest(w http.ResponseWriter, rest string) {
if rest == "abc" {
http.Error(w, "The go-routine should stop here", 500)
log.Println("something bad happened")
return
}
fmt.Print("This shouldn't be printed")
}
Run Code Online (Sandbox Code Playgroud)
这里的所有都是它的。当您说“内部错误不会停止处理请求”时,您似乎认为发生了更多的魔法,但在 Go 中,魔法很少。http.Error
将错误响应写回客户端。就这样。它没有办法“阻止”任何东西;它只是将状态代码和正文写入客户端连接,然后返回。在它返回之后,你有机会在调用代码中做更多的事情,但如果你只是想让你的函数返回,那么就返回。从处理程序返回的是“停止处理请求” - 您的代码是处理请求的内容,您可以完全控制。
归档时间: |
|
查看次数: |
1876 次 |
最近记录: |