我在文件中有HTML标记。我打算选择该标记,根据数据集替换其中的占位符,并返回合并的字符串。我可以简单地使用服务器端模板(我以前做过)但现在买不起,因为一些客户端代码需要相同的前端内容标记,即代码超出<apex:page standardController="account">
<apex:pageBlock title="The PageBLock">
<apex:pageBlockSection columns="1">
<apex:outputField value="{!account.name}"/>
<apex:outputField value="{!account.billingstate}"/>
<apex:outputField value="{!account.AccountNumber}"/>
<apex:pageBlockSectionItem>
<apex:outputLabel value="Name and Account Number" />
<apex:outputText value="{!account.name} {!account.AccountNumber}"></apex:outputText>
</apex:pageBlockSectionItem>
<apex:pageBlockSectionItem>
<apex:outputText value="{0,date,long}">
<apex:outputLabel value="Created Date" />
<apex:param value="{!account.CreatedDate}"/>
</apex:outputText>
</apex:pageBlockSectionItem>
<apex:repeat value="{!$ObjectType.account.FieldSets.New_Set}" var="field" >
<apex:outputField value="{!account[field]}"/>
</apex:repeat>
</apex:pageBlockSection>
</apex:pageBlock>
</apex:page>
。目前,服务器只要在运行到exec函数时就会挂起,并且抛出也不会抛出console.errors。
代码看起来像这样
public/
本质上,我需要在一天结束时 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))
});
});
作为另一个值呈现给另一个占位符,即render({available:availableFoodsString})。
public / index.html是一个普通的HTML,介于两者之间
{{name}}
{{price}}
添加到购物车因此,在DOM完全加载后,某些jQuery代码在某些时候也需要这个令人垂涎的标记,而模型中的availableFoodsString
包含名称和价格填充变量。
doc
函数是异步的,是的,但它在http.createServer函数内部由数据库打开连接回调调用,因此该变量肯定是在那时加载的。
我已经看到了一些其他解决方案,例如this和相关问题,但它们都涉及从npm中恳求一些外部模块,或者在替换和合并到所需变量之前从匹配的标记中写入新文件。我知道必须有一种方法可以实现这一点而不需要任何这些。
答案 0 :(得分:0)
这个问题与我的正则表达式有关。第二个括号犯了一个叫catastrophic backtracking的东西。这意味着比赛贪婪的方式使解释者通过地狱,即收回超过需要而不是根据需要反向回馈。我在正则表达式上敲了几个点,现在一切都无缝地工作了。
旧代码保持不变,只是正则表达式改变了:
/(<div class="food-menu">(\s*.*)*<\/div>)/gi
到此:
/(<div class="food-menu">(\s+.*)+<\/div>)/g
出于某种原因,以前的正则表达式似乎无缝地匹配文件字符串,我第一次测试它,但是一旦我用实际代码插入它就是残酷无情。