【问题标题】:How do I render an EJS template file in Node.js?如何在 Node.js 中呈现 EJS 模板文件?
【发布时间】:2012-01-29 10:42:49
【问题描述】:

我正在使用 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 模板文件?

【问题讨论】:

  • 所以你可以渲染一个字符串,为什么不直接将模板文件作为字符串读取并从那里获取呢?
  • 事实上,我对 node.js 很陌生,我不知道如何读取文件:D。也许我现在开始使用模板引擎还为时过早...

标签: node.js ejs


【解决方案1】:

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

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

来源:Official EJS documentation

【讨论】:

  • EJS 中的 renderFile 函数记录在 2020 年,位于其主文档页面(在“使用”部分):ejs.co/#docs
【解决方案2】:
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));
});

【讨论】:

  • 错了。 ReadFile 是异步函数,因此在服务器上完成请求时 templateString 可以为空。您应改为调用readFileSync 或在回调后启动服务器
  • @karaxuna:你说得很对,谢谢。现在修好了。我不知道为什么我在你发表评论时错过了你的评论......
  • 如果你使用同步功能,那么它没有回调。所以应该是:var templateString = fs.readFileSync('template.ejs', 'utf-8');
  • @karaxuna:我感冒了,我的头很晕。 :/ 再次感谢。
【解决方案3】:

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

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' }
      ]
    });  
  });
});

【讨论】:

    【解决方案4】:

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

    renderFile(path: string,data, cb)
    

    例如:

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

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

    【讨论】:

      【解决方案5】:

      此模式有一个同步版本,可以将其收紧一些。

      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),该函数将返回一个包含您的模板的字符串。

      【讨论】:

      • 在真实服务器上执行此操作会严重影响性能。
      【解决方案6】:

      @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);
        });
      

      【讨论】:

        【解决方案7】:

        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);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-14
          • 2015-06-18
          • 1970-01-01
          • 1970-01-01
          • 2017-05-10
          相关资源
          最近更新 更多