Go语言数据库查询网页输出时出现404 Not Found错误的原因排查
HTTP 404错误的含义及你的代码问题分析
404错误的含义
HTTP 404 "Page Not Found" 状态码表示你请求的URL路径在服务器上没有对应的处理程序或资源,服务器无法找到匹配的路由或文件来响应该请求。
你的代码产生404的主要原因
1. 路由匹配的路径问题
你的Go代码中注册的路由是:
http.HandleFunc("/dat/", home_db)
这个路由仅匹配以/dat/结尾的请求(比如http://localhost:8100/dat/),如果你访问的是http://localhost:8100/dat(不带末尾斜杠),Go的标准HTTP库不会自动进行路径重定向,会直接返回404错误。
2. 全局数据库变量未初始化(潜在致命问题)
你定义了全局变量var database *sql.DB,但在main函数中只是创建了db变量,并没有将其赋值给database:
db, err := sql.Open("mysql", "xxxxx:xxxxxx@tcp(xx.xx.xxx.xxx:xx)/xxxxx")
这会导致home_db函数中调用database.Query时触发nil pointer dereference panic,即使路由匹配成功,也会返回500错误而非正常渲染页面。
额外的模板语法错误(非404原因,但需修复)
你的HTML模板中{{.end}}是错误的,正确的模板语法应该是{{end}},否则模板渲染会失败:
{{range . }} <li> <td>{{.idЖанр}}</td> <td>{{.Название_жанра}}</td> </li> {{end}} <!-- 去掉前面的点 -->
另外,<li>标签嵌套在<table>中不符合HTML规范,应该用<tr>表示表格行:
{{range . }} <tr> <td>{{.idЖанр}}</td> <td>{{.Название_жанра}}</td> </tr> {{end}}
修复建议
- 调整路由注册,去掉末尾斜杠,让它匹配
/dat和/dat/(Go的http包会自动处理这种情况):
http.HandleFunc("/dat", home_db)
或者保留/dat/,确保访问时带上末尾斜杠。
- 将
main函数中的db赋值给全局database变量:
database, err := sql.Open("mysql", "xxxxx:xxxxxx@tcp(xx.xx.xxx.xxx:xx)/xxxxx")
或者直接在home_db函数中使用局部变量传递数据库连接(更推荐,避免全局变量)。
- 修复HTML模板的语法错误和标签嵌套问题。
内容的提问来源于stack exchange,提问作者Primel88
相关产品推荐
相关产品推荐

