11

私は 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}

コード.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)
4

3 に答える 3

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に追加されたため、現在使用できます。

于 2011-09-03T16:17:19.523 に答える
0

最近、同じ問題に遭遇しました。Alex Youngのチュートリアルでは、彼が jade.renderFile() を使用していたことをフォローしていました。あなたのケースと同様に、同じメソッドが見つからないというメッセージが表示されました。周りを調べたところ、彼が後のコミットで関数を更新したことがわかりました。この場合、彼は jade.renderFile() 関数の「ドロップイン」置換としてカスタム関数 (renderJadeFile) を作成しました (次のコード スニペットを参照)。

これが、この問題の解決策を探している他の人に役立つことを願っています.

// 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
      }
    });
  }
};
于 2011-11-21T12:34:47.977 に答える
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);
      });
于 2014-03-04T10:37:36.230 に答える