去模板中泄漏的http模板额外数据

时间:2016-05-01 08:54:55

标签: go go-gin

我正在使用gin库创建一个简单的crud webapp。我有一个路由设置,用于检查参数id以及是否应该呈现addadmin-employee-add.html ,否则返回具有id的员工(如果存在)当我渲染模板时 admin-employee-add.html的{​​{1}}错误消息泄漏到其中。 这是一张快照enter image description here

管理员-雇员-add.html

404 not found

创建错误的路线

{{template "pageStart.html" .}}
<form class="form-horizontal admin-employee">
  <div class="row form-group">
    <label for="employeeNumber" class="col-lg-2 control-label text-right">Employee #</label>
    <div class="col-lg-4">
      <span>new</span>
    </div>
    <label for="status" class="col-lg-2 control-label text-right">Status</label>
    <div class="col-lg-4">
      <span>new</span>
    </div>
  </div>
  <div class="row form-group">
    <label for="firstName" class="col-lg-2 control-label text-right">Name</label>
    <div class="col-lg-2">
      <input type="text" id="firstName" name="firstName" class="form-control">
    </div>
    <div class="col-lg-2">
      <input type="text" id="lastName" name="lastName" class="form-control">
    </div>
  </div>
  <div class="row form-group">
    <label for="startDate" class="col-lg-2 control-label text-right">Start Date</label>
    <div class="col-lg-2">
      <input type="date" id="startDate" name="startDate" class="form-control">
    </div>
    <label for="pto" class="control-label col-lg-2 col-lg-offset-2 text-right">PTO</label>
    <div class="col-lg-3">
      <input type="number" id="pto" name="pto" class="form-control">
    </div>
    <div class="col-lg-1">
      days
    </div>
  </div>
  <div class="row form-group">
    <label for="position" class="col-lg-2 control-label text-right">Position</label>
    <div class="col-lg-2">
      <select name="position" id="position" class="form-control">
        <option value="CEO">CEO</option>
        <option value="CTO">CTO</option>
        <option value="COO">COO</option>
        <option value="WorkerBee">Worker Bee</option>
      </select>
    </div>
  </div>
  <div class="col-lg-3 col-lg-offset-8">
    <button type="submit" class="btn btn-lg admin-primary">Create</button>
  </div>
</form>

错误似乎发生,因为杜松子酒正在尝试重定向r.GET("/employee/:id/", func(c *gin.Context) { id := c.Param("id") if id == "add" { c.HTML(http.StatusOK, "admin-employee-add.html", nil) } employee, ok := employees[id] if !ok { c.String(http.StatusNotFound, "404 not found", nil) } else { c.HTML(http.StatusOK, "admin-employee-edit.html", map[string]interface{}{ "Employee": employee, }) } }) - &gt; /add但我已在浏览器中使用/add/路由。

gin的调试日志

/add/

我尝试将路线更改为[GIN-debug] GET /login --> main.registerRoutes.func2 (3 handlers) [GIN-debug] GET /employee/:id/ --> main.registerRoutes.func3 (3 handlers) [GIN-debug] GET /employee/:id/vacation --> main.registerRoutes.func4 (3 handlers) [GIN-debug] GET /admin/ --> main.registerRoutes.func5 (4 handlers) [GIN-debug] Listening and serving HTTP on :3000 [GIN-debug] [WARNING] Headers were already written. Wanted to override status code 200 with 404 [GIN] 2016/05/01 - 14:12:13 | 404 | 1.101426ms | 127.0.0.1 | GET /employee/add/ ,然后显示错误。

/:id

注意:通过在redirecting request 301: /employee/add/ --> /employee/add [GIN-debug] [WARNING] Headers were already written. Wanted to override status code 200 with 404 末尾添加return,可以轻松解决此错误。但这种模式使代码看起来不那么干燥。这似乎更像if id == "add"问题。

1 个答案:

答案 0 :(得分:0)

正如您所说,通过在return末尾添加if id == "add"可以轻松解决此错误。

c.Stringc.HTML使用相同的Context c。在内部,它们写入同一个套接字(您可以将其视为文件指针)。因此,如果您调用c.String然后调用c.HTML,反之亦然,它会按照调用的顺序附加输出。

查看您的代码,我假设您希望在看到/employee/add时添加一名员工,即提供一个html页面来执行此操作。 /employee/<something-other-than-add-as-id>将获得并显示它 - 在本例中为html以编辑员工信息。

这里有必要在if id == "add"之后添加返回,因为为两个场景生成的html不同(它们使用不同的模板)。仅为/employee/add/添加一个单独的处理程序也是另一种选择。