簡體   English   中英

Node js-編譯車把視圖而不渲染它

[英]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

包裝方式:

  • 正文解析器:1.18.3
  • cors:2.8.4,
  • dotenv:5.0.1,
  • 快遞:4.16.3,
  • hbs:4.0.1
  • 時刻:2.22.1

讓我知道是否需要提供任何其他信息,而我未提供任何示例代碼的原因是我實際上不知道該嘗試什么。 我所嘗試的只是在我的路由內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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM