Render ejs файл в node.js
Эй, ребята, я играю с node.js и пытаюсь отобразить файл шаблона. Я понял, как рисовать строки:
var http = require('http');
var ejs = require('ejs');
var server = http.createServer(function(req, res){
res.end(ejs.render('Hello World'));
});
server.listen(3000);
Как я могу отобразить файл шаблона?
Ответы
Ответ 1
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));
});
Ответ 2
В ejs есть недокументированная функция для рендеринга файлов, вы можете просто сделать...
ejs.renderFile(__dirname + '/template.ejs', function(err, data) {
console.log(err || data)
})
источник
Ответ 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
Там есть синхронная версия этого шаблона, которая немного подтягивает его.
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), функция вернет строку, содержащую ваш шаблон.
Ответ 5
Ответ @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);
});
Ответ 6
Ответ @ksloan действительно хорош. У меня также был такой же вариант использования, и я немного поработал. Функция renderFile() перегружена. В основном вам понадобится:
renderFile(path: string,data, cb)
например:
ejs.renderFile(__dirname + '/template.ejs', dataForTemplate, function(err, data) {
console.log(err || data)
})
где dataForTemplate - это объект, содержащий значения, которые вам нужны внутри шаблона.