我们在Application.cfc中有以下代码:
<cffunction name="onError" returnType="void" output="false">
<cfargument name="exception" required="true">
<cfargument name="eventname" type="string" required="true">
<cfset cfcatch = exception>
<cfinclude template="standalone/errors/error.cfm">
</cffunction>
在error.cfm页面中,我们有这段代码(我没有写过):
<cfscript>
function GetCurrentURL() {
var theURL = "http";
if (cgi.https EQ "on" ) theURL = "#TheURL#s";
theURL = theURL & "://#cgi.server_name#";
if(cgi.server_port neq 80) theURL = theURL & ":#cgi.server_port#";
theURL = theURL & "#cgi.path_info#";
if(len(cgi.query_string)) theURL = theURL & "?#cgi.query_string#";
return theURL;
}
</cfscript>
这是脚本的一部分,它将错误的细节集合在一起并将其记录到数据库中。
当发生错误时,我们收到消息&#34;例程GetCurrentURL已在不同模板中声明两次。&#34;但是,我已经用几种不同的方式搜索了整个代码库,并找到了#34; GetCurrentURL&#34;只使用两次,两次都在error.cfm中。第一次是声明,第二次是实际使用。所以我不确定为什么CF会在不同的模板中说'#34;。
我的下一个想法是问题是递归调用,而error.cfm是错误的并且调用自身,所以我尝试了这两个更改,其中任何一个都应该已经解决了问题并且揭露了真正的错误:
<cfif StructKeyExists(variables,"GetCurrentURL") IS "NO">
<cfscript>
function GetCurrentURL() {
var theURL = "http";
if (cgi.https EQ "on" ) theURL = "#TheURL#s";
theURL = theURL & "://#cgi.server_name#";
if(cgi.server_port neq 80) theURL = theURL & ":#cgi.server_port#";
theURL = theURL & "#cgi.path_info#";
if(len(cgi.query_string)) theURL = theURL & "?#cgi.query_string#";
return theURL;
}
</cfscript>
</cfif>
和
<cfscript>
if (!StructKeyExists(variables,"GetCurrentURL")) {
function GetCurrentURL() {
var theURL = "http";
if (cgi.https EQ "on" ) theURL = "#TheURL#s";
theURL = theURL & "://#cgi.server_name#";
if(cgi.server_port neq 80) theURL = theURL & ":#cgi.server_port#";
theURL = theURL & "#cgi.path_info#";
if(len(cgi.query_string)) theURL = theURL & "?#cgi.query_string#";
return theURL;
}
}
</cfscript>
都没有奏效。我也尝试在函数调用之前将其添加到页面中:
<cfoutput>"#StructKeyExists(variables,"GetCurrentURL")#"</cfoutput>
它引起了“#34;是&#34;要在屏幕上打印。这表明上面的内容应该有效,因为if语句的内容显然会评估为&#34; YES&#34;,因此if语句将评估为false,因此函数将不会被声明,因此我将保持我的理智。但由于某些原因,这个问题仍然存在。
有关可能发生的事情或下一步如何解决问题的任何想法?我已经陷入困境。
答案 0 :(得分:3)
ColdFusion在将其编译为字节码时仍会看到函数声明。您可以使用cfinclude来包含函数声明:
<cfif StructKeyExists(variables,"GetCurrentURL") IS "NO">
<cfinclude template="udf.cfm" />
</cfif>
然后在udf.cfm中放置你的函数声明。这应该可以按你的意愿工作,并防止CF抛出错误。
答案 1 :(得分:-1)
另一种解决方案是在定义之前从范围中删除该函数。例如......
<cfset StructDelete(variables,'myFunction')>
<cffunction name="myFunction">...</cffunction>