2017-03-06 1 views
1

ファイルにHTMLマークアップがあります。そのマークアップを取り出し、データセットごとにプレースホルダを置き換え、マージした文字列を返すつもりです。クライアントサイドのコードではフロントエンドのコードに同じマークアップが必要(つまり、コードはpublic/を超えている必要があるため、これまではサーバーサイドテンプレートを使用していました)現在のところ、サーバーはexec関数に実行されたときにハングし、console.errorsは何もスローもスローもしません。追加の値をレンダリングすなわち別のプレースホルダをレンダリングするよう新しいファイルを書き込まずにマークアップをファイルに置き換えます。

コードは、本質的にこの

var availableFoodsString = "", 
regexCb = function (dataSet, flag, indexPage) { 
    return function(match, $1, index) { 
     if (indexPage == undefined && dataSet["username"] != undefined) { 
      dataSet["username_search"] = dataSet["username"]; 
     } 

     if (dataSet[$1] != undefined) return dataSet[$1]; 

     else if (flag == "EMPTY") return ""; 
     else if (flag == "MATCH") return match; 
    } 
}; 


foodsModel.find({availableToday: true}, function(err, docs) { 
    if (err) throw err; 

    docs.forEach(function (doc) { 
     doc = doc.toObject(); 
     doc.image = "/images/food/" + doc.name + ".jpg"; 

     var template = /(<div class="food-menu">(\s*.*)*<\/div>)/gi.exec(fs.readFileSync("public/index.html").toString())[0] 
     availableFoodsString += template.replace(/\{\{(\w+)\}\}/gi, regexCb(doc)) 
    }); 
}); 

のように見える、私は一日の終わりにavailableFoodsStringが必要({利用できる:availableFoodsString})。

公開/ index.htmlには{{名前}}

{{価格}}

ので、カートに追加し、一部ではこのどこかで通常のHTMLでありますjQueryコードでは、DOMが完全に読み込まれた後のある時点でこの欲しいマークアップが必要ですが、モデルのdocには名前と価格のフィラー変数が含まれています。

foodsModel.find()関数はasync、yesですが、データベースオープン接続コールバックによってhttp.createServer関数内で呼び出されるため、その時点で変数が確実に読み込まれます。

thisなどのいくつかの解決策を見てきましたが、npmから外部モジュールを募集したり、マッチしたマークアップから新しいファイルを書き込んだりして、必要な変数にマージします。私はそれらのどれもなしにこれを達成する方法がなければならないことを知っています。

+0

AngularJSやKnockoutのようなクライアントサイドフレームワークを再作成しようとしているようです。 – adam0101

+0

アプリケーションはすでに完了しています。最近の機能を追加するには、テンプレートをランディングページにダンプする必要がありました。最初からこれらの機能のいずれかを使って再構築することは、大惨事でハエを殺すような過剰なものであることに同意するでしょう。それが最悪の場合は、ファイルを別々のファイルに残して、AJAXを使用してフロントエンドでテンプレートを読み込むことに頼ることができます。私はちょうどもっとエレガントなものを見つけることができると思った。 –

+0

@ adam0101 *最初から を再構築することは、これらのフレームワーク*を持つもののいずれかを使用して再構築することが私の意図だったことに同意するでしょう。 "機能"ではありません。 SOの編集ボタンは私の携帯電話ではうまく動作しないAjaxを使用しているので、コメントを編集できませんでした。 –

答えて

0

問題は私の正規表現と関係がありました。 2番目のかっこはcatastrophic backtrackingと呼ばれています。これは、通訳者が地獄を通るように、つまり必要に応じて逆に返還するのではなく、必要以上に取り戻すという意味で、試合が貪欲であったことを意味します。私は正規表現のいくつかのスポットをノックし、すべてがシームレスに動作します。これに

/(<div class="food-menu">(\s*.*)*<\/div>)/gi

古いコードは同じとどまっただけの正規表現は、このから変更何らかの理由で

/(<div class="food-menu">(\s+.*)+<\/div>)/g

、前回の正規表現が一致して登場しましたファイルの文字列をシームレスに、最初にテストしましたが、実際のコードにプラグインすれば残酷ではありませんでした。

関連する問題