Node说Jade没有方法“renderFile”,为什么?

时间:2011-09-03 10:08:04

标签: javascript html node.js pug

我安装了jade(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”。但是,节点抛出错误并说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)

3 个答案:

答案 0 :(得分:13)

看起来新版本的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);

更新

这个答案在编写时是有效的,但是renderFile在几个月后又在92c314中添加了,因此现在可以使用它。

答案 1 :(得分:0)

我最近遇到了同样的问题。在我跟随的Alex Young tutorial中,他正在使用jade.renderFile()。与您的情况类似,我得到了相同的方法未找到消息。在搜索之后我发现他在稍后的提交中更新了该函数。在这种情况下,他创建了一个自定义函数(renderJadeFile)作为jade.renderFile()函数的“drop in”替换(请参阅下面的代码片段)。

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

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

答案 2 :(得分:0)

真正的解决方案是,您需要将绝对路径作为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);
      });