节点说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: 'tj@vision-media.ca', isA: 'human' },
tobi: { age: 1, email: 'tobi@is-amazing.com', isA: 'ferret' }
}
}
};
console.log(jade)
jade.renderFile('code.jade', options, function(err, html){
if (err) throw err;
console.log(html);
});
我将这些文件保存在自己的文件夹中,然后在那里执行“node code.js”。 然而,节点抛出一个错误,并说翡翠没有方法“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)
它看起来像Jade的新版本使用不同的API,没有更多'renderFile'方法。 看看这里的'公共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: 'tj@vision-media.ca', isA: 'human' },
tobi: { age: 1, email: 'tobi@is-amazing.com', isA: 'ferret' }
}
});
console.log(html);
更新
这个答案在编写时是有效的,但是在92c314之后的几个月里, renderFile
被添加回来了,所以现在可以使用它。
我最近遇到了同样的问题。 在Alex Young教程中,我跟着他使用了jade.renderFile()。 类似于你的情况,我得到了同样的方法找不到消息。 在四处搜寻后,我发现他在稍后的提交中更新了该函数。 在这种情况下,他创建了一个自定义函数(renderJadeFile)作为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
}
});
}
};
真正的解决方案,你需要传递一个绝对路径作为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);
});
链接地址: http://www.djcxy.com/p/97029.html
上一篇: Node says Jade has no method "renderFile", why?
下一篇: module.exports that include all functions in a single line