Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Node.js中呈现EJS模板文件?_Node.js_Ejs - Fatal编程技术网

如何在Node.js中呈现EJS模板文件?

如何在Node.js中呈现EJS模板文件?,node.js,ejs,Node.js,Ejs,我正在使用Node.js并尝试呈现一个EJS模板文件。我知道了如何渲染字符串: var http=require('http'); var ejs=需要('ejs'); var server=http.createServer(函数(req,res){ res.end(ejs.render('Hello World')); }); 听(3000); 如何呈现EJS模板文件 var templateString = null; var fs = require('fs'); var templa

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

var http=require('http');
var ejs=需要('ejs');
var server=http.createServer(函数(req,res){
res.end(ejs.render('Hello World'));
});
听(3000);
如何呈现EJS模板文件

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

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

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

这种模式有一个同步版本,它使它更加紧密

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

EJS中有一个渲染文件的函数,您只需执行以下操作:

ejs.renderFile(uu dirname+'/template.ejs',函数(err,data){
console.log(err | | data);
});

来源:

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

下面是一个如何与蓝鸟一起使用的示例:

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);
  });
@克斯洛恩的回答真的很好。我也有同样的用例,做了一些挖掘。函数renderFile()已重载。您最需要的是:

renderFile(path: string,data, cb)
例如:

ejs.renderFile(__dirname + '/template.ejs', dataForTemplate, function(err, data) {
console.log(err || data)
})
其中dataForTemplate是一个对象,包含模板内部所需的值。

使用
ejs.renderFile(文件名,数据)
函数和异步等待

以呈现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);
    }
}
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);
    }
}
以呈现EJS文件。

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

只需将express view引擎设置为“ejs”

当然,您需要将目录设置为:

  • 视图(包含所有主视图和局部视图)
  • app.js(具有上述配置)

就是这样。

所以你可以渲染一个字符串,为什么不直接将模板文件作为字符串读入并从中获取呢?事实是,我对node.js太陌生了,我不知道如何读取文件:D。也许现在开始使用模板引擎还为时过早……在真正的服务器上这样做会严重影响性能。这是错误的。ReadFile是异步函数,所以在服务器上完成请求时templateString可以为null。您应该改为调用
readFileSync
,或者在之后启动服务器callback@karaxuna:你说得很对,谢谢。现在修好了。我不知道为什么在你们发表评论的时候我错过了你们的评论…若你们使用同步功能,那个么它就并没有回调。所以应该是:
var templateString=fs.readFileSync('template.ejs','utf-8')@karaxuna:我感冒了,头晕。:/再次感谢。这个答案应该被多次投票。使用正确的函数比其他函数要简单得多。EJS中的renderFile函数在2020年就有文档记录,它位于其主文档页(在用法部分):