【问题标题】:Node says Jade has no method "renderFile", why?Node 说 Jade 没有方法“renderFile”,为什么?
【发布时间】:2011-11-09 16:27:21
【问题描述】:

我安装了 Jade (npm install jam) 并访问了他们的 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);
});

我将这些文件保存在他们自己的文件夹中,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)

【问题讨论】:

    标签: javascript html node.js pug


    【解决方案1】:

    看起来较新版本的 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,所以现在可以使用了。

    【讨论】:

    • 我应该补充一点,对于当前版本的节点,您需要将 toString() 更改为 toString('utf8', 0, jamfile.length)
    • 好点。我添加了编码参数。边界会自动填充。
    • 第 5 行在jadetemplate 中缺少at
    • 好答案!非常有帮助。对于其他 node.js 新手,请查看(此线程)[stackoverflow.com/questions/5797852/… 以获取有关如何包含文件的示例(以便您可以将数据移出渲染脚本)。
    • Jade 在他们的文档中有一个 renderFile API。发生了什么事?
    【解决方案2】:

    我最近遇到了同样的问题。在Alex Young tutorial 中,我关注他正在使用jade.renderFile()。与您的情况类似,我收到了相同的方法未找到消息。在四处搜索后,我发现他在以后的提交中更新了该功能。在这种情况下,他创建了一个自定义函数 (renderJadeFile) 作为 jam.renderFile() 函数的“插入”替代品(参见以下代码 sn-p)。

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

    // 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】:

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

      【讨论】:

        猜你喜欢
        • 2013-11-04
        • 1970-01-01
        • 2019-03-08
        • 1970-01-01
        • 1970-01-01
        • 2016-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多