使用 golang 将 html 模板作为文本字段存储在数据库中
Storing html template as text field in DB using golang
我是 Go 和 Echo 的初学者。
我需要存储一个 html template(email template) ,其中还将包含一些作为上下文传递的详细信息。这样它就可以存储到正文列中(MySQL 中的文本),稍后将被触发。
if user.Email !=""{
visitingDetails := H{"user_name" : user.Fname,
"location" : location.Name,
"visitor_company": visitor.Company,
"visitor_name" : visitor.Fname +" "+visitor.Lname,
"visitor_phone" : visitor.Phone,
"visitor_email" : visitor.Email,
"visitor_fname" : visitor.Fname,
"visitor_image" : visitor.ProfilePicture,
}
subject := visitor.Fname +" has come to visit you at the reception"
body := c.Render(http.StatusOK,"email/user_notify_email.html",visitingDetails)
emailJob := models.EmailJob{Recipients: visitor.Email , Subject: subject, Body: body}
db.Create(&emailJob)
if db.NewRecord(emailJob){
fmt.Println("Unable to send email")
}
}
电子邮件工作
type EmailJob struct {
Id int
Recipients string
Subject string
Body string
Sent int
Error string
}
func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
return t.templates.ExecuteTemplate(w, name, data)
}
正文 := c.Render(http.StatusOK,"email/user_notify_email.html",访问详情)
此行给出错误,因为它 returns 渲染错误。
我不确定我将如何做?我希望我说清楚了。提供一点帮助将不胜感激。
您使用的 context.Render
方法不正确。
https://github.com/labstack/echo/blob/master/context.go#L111
// Render renders a template with data and sends a text/html response with status
// code. Renderer must be registered using `Echo.Renderer`.
Render(code int, name string, data interface{}) error
Render 方法呈现模板并将其作为响应发送。
这个方法returns一个错误值,如果发生意外,这个错误值就是对它的描述。否则,它等于 nil
。
参见:https://golang.org/pkg/errors/
为了使用渲染器,您必须注册它,您可以使用那个注册的渲染器来获取渲染的模板文本并将其保存在数据库中。
您可以在 Echo 框架的单元测试中看到示例渲染器:https://github.com/labstack/echo/blob/master/context_test.go#L23
希望对您有所帮助。
在做了一些事情并了解了 golang 中的模板之后。
我想出了这样的解决方案。
t, err := template.ParseFiles("templates/email/user_notify_email.html")
if err != nil {
fmt.Println("Error happend")
fmt.Println(err)
return c.JSON(http.StatusOK, data)
}
buf := new(bytes.Buffer)
if err = t.Execute(buf, visitingDetails); err != nil {
fmt.Println(err)
}
body := buf.String()
现在可以存放这具尸体了。 Body 呈现了我需要的模板。
很多功劳都归功于这篇文章 https://medium.com/@dhanushgopinath/sending-html-emails-using-templates-in-golang-9e953ca32f3d
我是 Go 和 Echo 的初学者。 我需要存储一个 html template(email template) ,其中还将包含一些作为上下文传递的详细信息。这样它就可以存储到正文列中(MySQL 中的文本),稍后将被触发。
if user.Email !=""{
visitingDetails := H{"user_name" : user.Fname,
"location" : location.Name,
"visitor_company": visitor.Company,
"visitor_name" : visitor.Fname +" "+visitor.Lname,
"visitor_phone" : visitor.Phone,
"visitor_email" : visitor.Email,
"visitor_fname" : visitor.Fname,
"visitor_image" : visitor.ProfilePicture,
}
subject := visitor.Fname +" has come to visit you at the reception"
body := c.Render(http.StatusOK,"email/user_notify_email.html",visitingDetails)
emailJob := models.EmailJob{Recipients: visitor.Email , Subject: subject, Body: body}
db.Create(&emailJob)
if db.NewRecord(emailJob){
fmt.Println("Unable to send email")
}
}
电子邮件工作
type EmailJob struct {
Id int
Recipients string
Subject string
Body string
Sent int
Error string
}
func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
return t.templates.ExecuteTemplate(w, name, data)
}
正文 := c.Render(http.StatusOK,"email/user_notify_email.html",访问详情)
此行给出错误,因为它 returns 渲染错误。 我不确定我将如何做?我希望我说清楚了。提供一点帮助将不胜感激。
您使用的 context.Render
方法不正确。
https://github.com/labstack/echo/blob/master/context.go#L111
// Render renders a template with data and sends a text/html response with status
// code. Renderer must be registered using `Echo.Renderer`.
Render(code int, name string, data interface{}) error
Render 方法呈现模板并将其作为响应发送。
这个方法returns一个错误值,如果发生意外,这个错误值就是对它的描述。否则,它等于 nil
。
参见:https://golang.org/pkg/errors/
为了使用渲染器,您必须注册它,您可以使用那个注册的渲染器来获取渲染的模板文本并将其保存在数据库中。
您可以在 Echo 框架的单元测试中看到示例渲染器:https://github.com/labstack/echo/blob/master/context_test.go#L23
希望对您有所帮助。
在做了一些事情并了解了 golang 中的模板之后。 我想出了这样的解决方案。
t, err := template.ParseFiles("templates/email/user_notify_email.html")
if err != nil {
fmt.Println("Error happend")
fmt.Println(err)
return c.JSON(http.StatusOK, data)
}
buf := new(bytes.Buffer)
if err = t.Execute(buf, visitingDetails); err != nil {
fmt.Println(err)
}
body := buf.String()
现在可以存放这具尸体了。 Body 呈现了我需要的模板。 很多功劳都归功于这篇文章 https://medium.com/@dhanushgopinath/sending-html-emails-using-templates-in-golang-9e953ca32f3d