加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在golang中处理模板错误的惯用方法

发布时间:2020-12-16 19:23:26 所属栏目:大数据 来源:网络整理
导读:假设我有一个如下所示的html /模板: htmlbody p{{SomeFunc .SomeData}}/p/body 有时SomeFunc会返回错误.有没有惯用的方法来解决这个问题? 如果我直接写入ResponseWriter,则在遇到错误之前已经写入了状态代码200. var tmpl *template.Templatefunc Handler(
假设我有一个如下所示的html /模板:
<html>
<body>
    <p>{{SomeFunc .SomeData}}</p>
</body>

有时SomeFunc会返回错误.有没有惯用的方法来解决这个问题?

如果我直接写入ResponseWriter,则在遇到错误之前已经写入了状态代码200.

var tmpl *template.Template

func Handler(w http.ResponseWriter,r *http.Request) {
    err := tmpl.Execute(w,data)
    // "<html><body><p>" has already been written...
    // what to do with err?
}

我最好返回状态代码400或其他一些,但如果我直接在ResponseWriter上使用template.Execute,我就看不到这样做的方法.有什么我想念的吗?

由于模板引擎即时生成输出,因此SomeFunc调用之前的模板部分已经发送到输出.如果输出未缓冲,则可能已经发送了它们(以及HTTP 200状态).

你无能为力.

你可以做的是在调用template.Execute()之前执行检查.在琐碎的情况下,调用SomeFunc()并检查其返回值应该足够了.如果选择此路径并且SomeFunc()的返回值很复杂,则无需再次从模板中调用它,只需将其返回值传递给传递给模板的参数,然后在该模板中引用该值.模板(因此SomeFunc()不必执行两次).

如果这还不够或您无法控制它,您可以创建一个bytes.Buffer,执行指向此缓冲区的模板,并在Execute()返回后检查是否有错误.如果有错误,请发回适当的错误消息/页面.如果一切正常,您只需将缓冲区的内容发送到ResponseWriter即可.

这看起来像这样:

buf := &bytes.Buffer{}
err := tmpl.Execute(buf,data)
if err != nil {
    // Send back error message,for example:
    http.Error(w,"Hey,Request was bad!",http.StatusBadRequest) // HTTP 400 status
} else {
    // No error,send the content,HTTP 200 response status implied
    buf.WriteTo(w)
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读