Node говорит, что у Jade нет метода "renderFile", почему?
Я установил нефрит (npm install jade) и перешел на свою страницу github, чтобы получить некоторые примеры. Это то, что я хотел выполнить:
code.jade:
- var title = "Things"
h1= title
ul#users
- each user, name in users
- if (user.isA == "ferret")
li(class: 'user-' + name) #{name} is just a ferret
- else
li(class: 'user-' + name) #{name} #{user.email}
code.js:
var jade = require('jade');
var options = {
locals: {
users: {
tj: { age: 23, email: '[email protected]', isA: 'human' },
tobi: { age: 1, email: '[email protected]', isA: 'ferret' }
}
}
};
console.log(jade)
jade.renderFile('code.jade', options, function(err, html){
if (err) throw err;
console.log(html);
});
Я сохранил эти файлы в их собственной папке, cd'd поступил туда и выполнил "node code.js". Однако node выдает сообщение об ошибке и говорит, что у Jade нет метода "renderFile"! Можете ли вы сказать мне, что я делаю неправильно, и что мне делать, чтобы исправить это?
полное сообщение об ошибке:
node.js:134
throw e; // process.nextTick error, or 'error' event on first tick
^
TypeError: Object #<Object> has no method 'renderFile'
at Object.<anonymous> (/home/yann/javascript/jade/code.js:18:6)
at Module._compile (module.js:402:26)
at Object..js (module.js:408:10)
at Module.load (module.js:334:31)
at Function._load (module.js:293:12)
at Array.<anonymous> (module.js:421:10)
at EventEmitter._tickCallback (node.js:126:26)
Ответы
Ответ 1
Похоже, что более новые версии Jade используют другой API, больше нет метода renderFile. Взгляните на раздел "Public API" здесь: https://github.com/visionmedia/jade
Что-то вроде этого, вероятно, то, что вы хотите. Просто помните, что вам нужно только один раз прочитать файл. Если вы делаете это динамически, обязательно не читайте его синхронно.
var jade = require('jade');
var fs = require('fs');
var jadetemplate = jade.compile(fs.readFileSync('code.jade', 'utf8'));
var html = jadetemplate({
users: {
tj: { age: 23, email: '[email protected]', isA: 'human' },
tobi: { age: 1, email: '[email protected]', isA: 'ferret' }
}
});
console.log(html);
Update
Этот ответ был действителен, когда он был написан, однако renderFile
был добавлен через несколько месяцев в 92c314, поэтому он может теперь можно использовать.
Ответ 2
Недавно я столкнулся с той же проблемой. В Alex Young tutorial Я следил за тем, чтобы использовать jade.renderFile(). Подобно вашему делу, я получал тот же метод, что и не найденное сообщение. После поиска я обнаружил, что он обновил функцию в более позднем фиксации. В этом случае он создал пользовательскую функцию (renderJadeFile) в качестве замены "drop in" для функции jade.renderFile() (см. Следующий фрагмент кода).
Надеемся, что это поможет другим найти решение этой проблемы.
// Replacement function for jade.renderFile.
function renderJadeFile(template, options) {
var fn = jade.compile(template, options);
return fn(options.locals);
}
emails = {
send: function(template, mailOptions, templateOptions) {
mailOptions.to = mailOptions.to;
// jade.renderFile(path.join(__dirname, 'views', 'mailer', template), templateOptions, function(err, text) {
renderJadeFile(path.join(__dirname, 'views', 'mailer', template), templateOptions, function(err, text) {
// Add the rendered Jade template to the mailOptions
mailOptions.body = text;
// CODE SHORTENED FOR BREVETIY
},
sendWelcome: function(user) {
this.send('welcome.jade', {
to: user.email,
subject: 'Welcome to Nodepad'
},
{ locals: {
user: user
}
});
}
};
Ответ 3
Реальное решение, вам необходимо передать абсолютный путь в качестве 1-го параметра в функции renderFile. Он должен быть относительно корня. "code.jade" не будет работать. Вот рабочий пример:
jade.renderFile('/Users/tom/documents/xueqiu/pp-fe/views/a-share.jade', {name:'Shenxin Xu'}, function(err, html){
console.log(1111 + ' ' + html);
});