Javascript Node说Jade没有办法;“渲染文件”;,为什么?

Javascript Node说Jade没有办法;“渲染文件”;,为什么?,javascript,html,node.js,pug,Javascript,Html,Node.js,Pug,我安装了jade(npm安装jade)并转到他们的github页面获取一些示例。这就是我想要执行的: 代码.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: 'us

我安装了jade(npm安装jade)并转到他们的github页面获取一些示例。这就是我想要执行的:

代码.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);
});
我将这些文件保存在它们自己的文件夹中,然后用cd刻录到那里并执行“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)
node.js:134
抛出e;//process.nextTick错误,或第一次勾选时的“error”事件
^
TypeError:对象#没有方法“renderFile”
反对。(/home/yann/javascript/jade/code.js:18:6)
编译(Module.js:402:26)
at Object..js(module.js:408:10)
在Module.load(Module.js:334:31)
at函数。_加载(module.js:293:12)
在阵列上。(模块js:421:10)
在EventEmitter上进行回调(node.js:126:26)

新版本的Jade似乎使用了不同的API,不再有“renderFile”方法。请参阅此处的“公共API”部分:

像这样的东西可能是你想要的。请记住,您只需要读取文件一次。如果您是动态执行的,请确保不要同步读取

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);
更新
这个答案在编写时是有效的,但是,
renderFile
是在几个月后在中添加的,因此现在可以使用它。

我最近遇到了同样的问题。在我跟踪的过程中,他使用了jade.renderFile()。与您的情况类似,我收到了相同的“未找到方法”消息。在四处搜索之后,我发现他在后来的提交中更新了函数。在本例中,他创建了一个自定义函数(renderJadeFile),作为jade.renderFile()函数的“插入式”替换(请参见下面的代码片段)

希望这能帮助其他人找到解决这个问题的方法

//jade.renderFile的替换函数。
函数renderJadeFile(模板、选项){
var fn=jade.compile(模板、选项);
返回fn(选项。本地值);
}
电子邮件={
发送:函数(模板、邮件选项、模板选项){
mailpoptions.to=mailpoptions.to;
//renderFile(path.join(uu dirname,'views','mailer',template),templateOptions,function(err,text){
renderJadeFile(path.join(uu dirname,'views','mailer',template),templateOptions,函数(err,text){
//将渲染的Jade模板添加到邮件选项
mailpoptions.body=文本;
//BREVETIY的代码缩写
},
sendWelcome:函数(用户){
这个。发送('welcome.jade'{
致:user.email,
主题:“欢迎来到Nodepad”
},
{当地人:{
用户:用户
}
});
}
};

真正的解决方案是,您需要在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);
      });

我应该补充的是,对于当前版本的node,您需要将toString()更改为toString('utf8',0,jadefle.length)这一点很好。我添加了编码参数。虽然在jadeTemp
at
eGood答案中第5行缺少
at
,但边界将自动填充。非常有用。对于其他node.js新手,请查看(此线程)[例如关于如何包含文件的示例(以便您可以将数据移出渲染脚本)。Jade的文档中有一个渲染文件API。发生了什么?