示例把原始内部错误文本返回给 HTTP 客户端
原文依据:3 处请求处理示例直接调用 `http.Error(w, err.Error(), 500)`。如果仓库采用该示例,底层数据库或服务错误会原样进入响应。
错误可能暴露数据库信息、内部服务名称、文件路径、查询细节或其他本应只写入服务端日志的诊断信息。
这是可复制的请求处理示例:作用域调用失败时,它把 `err.Error()` 直接作为 500 响应正文发送。若错误含数据库地址、查询细节、内部类型或配置内容,远程客户端可能看到这些信息。它不是自动运行的实现,但采用示例时风险成立。用户可要求对外返回固定消息,并只在服务端记录详细错误。
func NewUserRoute(repo *UserRepo) RouteResult { return RouteResult{Route: Route{ Pattern: "/users", Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { users, err := repo.List(r.Context()) if err != nil { http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) return } fmt.Fprintf(w, "%d users", len(users)) }), }}查看另外 2 个位置
err := scope.Invoke(func(h *Handler) error { return h.Serve(w, req) }) if err != nil { http.Error(w, err.Error(), 500) }}func handle(w http.ResponseWriter, req *http.Request) { scope := root.Scope("request") // Request-scoped values must(scope.Provide(func() *http.Request { return req })) must(scope.Provide(func() RequestID { return RequestID(req.Header.Get("X-Request-ID")) })) must(scope.Decorate(func(l *zap.Logger) *zap.Logger { return l.With(zap.String("request_id", req.Header.Get("X-Request-ID"))) })) err := scope.Invoke(func(h *Handler) error { return h.Serve(w, req) }) if err != nil { http.Error(w, err.Error(), 500) }}```