ファイルに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から外部モジュールを募集したり、マッチしたマークアップから新しいファイルを書き込んだりして、必要な変数にマージします。私はそれらのどれもなしにこれを達成する方法がなければならないことを知っています。
AngularJSやKnockoutのようなクライアントサイドフレームワークを再作成しようとしているようです。 – adam0101
アプリケーションはすでに完了しています。最近の機能を追加するには、テンプレートをランディングページにダンプする必要がありました。最初からこれらの機能のいずれかを使って再構築することは、大惨事でハエを殺すような過剰なものであることに同意するでしょう。それが最悪の場合は、ファイルを別々のファイルに残して、AJAXを使用してフロントエンドでテンプレートを読み込むことに頼ることができます。私はちょうどもっとエレガントなものを見つけることができると思った。 –
@ adam0101 *最初から を再構築することは、これらのフレームワーク*を持つもののいずれかを使用して再構築することが私の意図だったことに同意するでしょう。 "機能"ではありません。 SOの編集ボタンは私の携帯電話ではうまく動作しないAjaxを使用しているので、コメントを編集できませんでした。 –