节点说翡翠没有方法“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

像这样的东西可能是你想要的。 只记得你只需要读一次文件。 如果您正在dynamic执行此操作,请不要同步读取它。

 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()。 类似于你的情况,我得到了同样的方法找不到消息。 在四处搜寻后,我发现他在稍后的提交中更新了该函数。 在这种情况下,他创build了一个自定义函数(renderJadeFile)作为jade.renderFile()函数的“放入”replace(请参阅下面的代码片段)。

希望这可以帮助其他人寻找解决这个问题的方法。

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

真正的解决scheme,你需要传递一个绝对path作为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); });