2

NodeJS を使用していくつかの開発を開始したところ、非常にイライラするエラーが発生しました。

.jade を .html にコンパイルする機能があります

function compileJadeFile(jadeFile){
    var pathToFile = "./index.jade";

    fs.exists(pathToFile, function(exists){
        if(exists){
            fs.readFile(pathToFile, function(err, data){
                                    var html = jade.compile(data)();
                                    return html;
            });
        }
    });
}

すべて正常に動作しますが、コンパイルされた html を提供したいと思います。だから私はこのようなことをしました:

res.write(compileJadeFile("index.jade"));

( の未使用のパラメータは気にしないでくださいcompileJadeFile。オリジナルで使用されています。この例では短くしただけです)

結果をcompileJadeFile("index.jade")コンソールに記録すると、次のようになります"undefined":(

これをグーグルで検索しましたが、問題を解決するものは何も見つかりませんでした。どなたか助けていただけませんか?私は C# や C++ でコーディングするのに慣れているので、Javascript に特別な何かまたは何かが欠けているのではないでしょうか?

4

1 に答える 1

4

コードは同期ですが、使用しているコードは非同期です。問題は、関数を呼び出してcompileJadeFileも実際には何も返されないため、その戻り値は定義によるものundefinedです。

関数自体も非同期にし、コールバックを導入してメソッドを次のように変更する必要があります。

function compileJadeFile(jadeFile, callback) {
  var pathToFile = "./index.jade";

  fs.exists(pathToFile, function(exists) {
    if(exists){
      fs.readFile(pathToFile, function(err, data) {
        var html = jade.compile(data)();
        callback(html);
      });
    }
  });
}

次に、次のように使用できます。

compileJadeFile("index.jade", function (html) {
  res.write(html);
  res.end();
});

Node.js に完全に準拠したコールバックの場合、コールバックはerrエラーを転送する最初のパラメータとして常に持つ必要があることに注意してください。したがって、コードは理想的には次のようになります。

compileJadeFile("index.jade", function (err, html) {
  if (err) { throw err; }
  res.write(html);
  res.end();
});

次に、もちろん、コールバックの呼び出しを次のように変更する必要があります。

callback(null, html);

お役に立てれば :-)。

于 2013-04-01T11:25:22.907 に答える