![](/img/trans.png)
[英]Pass array to view without html encoding issue node js(handlebars)
[英]Node js - Compile handlebars view without rendering it
我的問題很簡單:我想編譯一個Handlebars視圖,然后不呈現它-相反,我想使用已編譯的HTML服務器端。 在研究問題時, 這是我所能找到的最接近的問題,但是除非引起我的誤解,否則他們在此問題中所做的所有工作都是在服務器端創建HTML字符串並將其填充數據。 這是不夠的,因為我不想創建任何HTML字符串,而我確實想像往常一樣將HTML存儲在.hbs
文件中,然后編譯視圖(即,將其發送給我的變量),而不是將其顯示給用戶(由於僅是API服務器而無法實現),我想將已編譯的HTML發送給Mailgun(但我想將其發送給Mailgun的事實不在范圍之內,因此,答案最好是只告訴我如何編譯視圖,並能夠(例如) console.log()
HTML)。
我正在使用Node v9.8.0
包裝方式:
讓我知道是否需要提供任何其他信息,而我未提供任何示例代碼的原因是我實際上不知道該嘗試什么。 我所嘗試的只是在我的路由內Cannot set headers after they are sent to the client
let emailHtml = res.render('email/contactReceipt.hbs', { name:req.body.name })
但這給了我錯誤: Cannot set headers after they are sent to the client
let emailHtml = res.render('email/contactReceipt.hbs', { name:req.body.name })
Cannot set headers after they are sent to the client
。
旁注:我對Node.js相當陌生,它不屬於我的常規堆棧。 我注意到其他人使用包“ express-handlebars”,甚至只是“ handlebars”,因此,如果我正在使用的東西('hbs')實際上與Handlebars無關,或者我將無法使用完成我要嘗試做的事情,讓我知道。
res.render
接受第三個參數,該參數是包含渲染字符串的回調,而無需發送響應,從而避免了Headers already sent
錯誤
res.render(view [, locals] [, callback])
渲染視圖,並將渲染的HTML字符串發送到客戶端。 可選參數:
- locals,一個對象,其屬性定義視圖的局部變量。
- callback,一個回調函數 。 如果提供,該方法將返回可能的錯誤和呈現的字符串,但不會執行自動響應。 發生錯誤時,該方法在內部調用next(err)。
res.render('email/contactReceipt.hbs', { name:req.body.name }, (err, html) => {
if(err)
return console.error(err);
// do whatever you want here with `html`
});
您還可以使用app.render它類似於res.render
但是其在全球范圍內,始終需要一個第三個參數。
app.render('email/contactReceipt.hbs', { name:req.body.name }, (err, html) => {
if(err)
return console.error(err);
// do whatever you want here with `html`
});
或者,您可以直接編譯模板,以后再做任何您想做的事情。
const hbs = require('hbs');
const template = hbs.compile('<h1>{{title}}</h1>');
const html = template({ title: 'Handlebars' });
console.log(html); // <h1>Handlebars</h1>
如果要從磁盤讀取模板內容,只需使用fs.readFile
並將內容傳遞給hbs.compile
const hbs = require('hbs');
const fs = require('fs');
const readFile = require('util').promisify(fs.readFile);
async render(file, data) {
const content = await readFile(file, 'utf8');
// Implement cache if you want
const template = hbs.compile(content);
return template(data);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.