21

我正在使用 Node.js 并尝试呈现 EJS 模板文件。我想出了如何渲染字符串:

    var http = require('http');
    var ejs = require('ejs');

    var server = http.createServer(function(req, res){
        res.end(ejs.render('Hello World'));
    });

    server.listen(3000);

如何渲染 EJS 模板文件?

4

7 回答 7

52

EJS中有一个渲染文件的功能,你可以这样做:

    ejs.renderFile(__dirname + '/template.ejs', function(err, data) {
        console.log(err || data);
    });

来源:官方 EJS 文档

于 2016-02-10T01:56:12.470 回答
25
var templateString = null;
var fs = require('fs');
var templateString = fs.readFileSync('template.ejs', 'utf-8');

然后你做你的事:

var server = http.createServer(function(req, res){
    res.end(ejs.render(templateString));
});
于 2011-12-28T20:09:25.783 回答
5

您所要做的就是将文件编译为字符串(带有可选的局部变量),如下所示:

var fs = require('fs'), ejs = require('ejs'), http = require('http'), 
         server, filePath;
filePath = __dirname + '/sample.html'; // this is from your current directory
fs.readFile(filePath, 'utf-8', function(error, content) {
  if (error) { throw error); }
  // start the server once you have the content of the file
  http.createServer(function(req, res) {
    // render the file using some local params
    res.end(ejs.render(content, {
      users: [
        { name: 'tj' },
        { name: 'mape' },
        { name: 'guillermo' }
      ]
    });  
  });
});
于 2011-12-28T20:14:47.093 回答
4

@ksloan的回答真的很好。我也有同样的用例并且做了一点点挖掘。函数 renderFile() 被重载。您最需要的是:

renderFile(path: string,data, cb)

例如:

ejs.renderFile(__dirname + '/template.ejs', dataForTemplate, function(err, data) {
console.log(err || data)
})

其中dataForTemplate是一个对象,其中包含您在模板中需要的值。

于 2018-02-20T06:45:33.010 回答
3

这种模式有一个同步版本,它更加收紧了一点。

var server = http.createServer(function(req, res) {
    var filePath = __dirname + '/sample.html';
    var template = fs.readFileSync(filePath, 'utf8');
    res.end(ejs.render(template,{}));
});

注意使用readFileSync ()。如果您指定编码(此处为 utf8),该函数将返回一个包含您的模板的字符串。

于 2013-01-03T19:48:40.460 回答
3

@ksloan 的答案应该是公认的。它正是为此目的使用了 ejs 函数。

以下是如何与 Bluebird 一起使用的示例:

var Promise = require('bluebird');
var path = require('path');
var ejs = Promise.promisifyAll(require('ejs'));

ejs.renderFileAsync(path.join(__dirname, 'template.ejs'), {context: 'my context'})
  .then(function (tpl) {
    console.log(tpl);
  })
  .catch(function (error) {
    console.log(error);
  });

为了完整起见,这里是当前接受的答案的承诺版本:

var ejs = require('ejs');
var Promise = require('bluebird');
var fs = Promise.promisifyAll(require('fs'));
var path = require('path');

fs.readFileAsync(path.join(__dirname, 'template.ejs'), 'utf-8')
  .then(function (tpl) {
    console.log(ejs.render(tpl, {context: 'my context'}));
  })
  .catch(function (error) {
    console.log(error);
  });
于 2016-08-08T21:48:44.790 回答
0

使用ejs.renderFile(filename, data)带有async-await 的函数。

呈现 HTML 文件。

const renderHtmlFile = async () => {
    try {
        //Parameters inside the HTML file
        let params = {firstName : 'John', lastName: 'Doe'};
        let html = await ejs.renderFile(__dirname + '/template.html', params);
        console.log(html);
    } catch (error) {
        console.log("Error occured: ", error);
    }
}

渲染 EJS 文件。

const renderEjsFile = async () => {
    try {
        //Parameters inside the HTML file
        let params = {firstName : 'John', lastName: 'Doe'};
        let ejs = await ejs.renderFile(__dirname + '/template.ejs', params);
        console.log(ejs);
    } catch (error) {
        console.log("Error occured: ", error);
    }
}
于 2020-04-15T18:49:59.353 回答