Wir haben den folgenden Code in unserem Application.cfc:Coldfusion „Routinen können nicht mehr deklariert werden als einmal“
<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>
Im error.cfm Seite wir diesen Code haben (ich habe es nicht geschrieben):
<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>
Dies ist alles Teil eines Skripts, das viele Details zum Fehler zusammenfasst und in der Datenbank speichert.
Wenn ein Fehler auftritt, erhalten wir die Nachricht "Die Routine GetCurrentURL wurde zweimal in verschiedenen Vorlagen deklariert." Allerdings habe ich die gesamte Codebasis auf verschiedene Arten durchsucht und festgestellt, dass "GetCurrentURL" nur zweimal verwendet wurde, beide Male in error.cfm. Das erste Mal ist die Deklaration, und das zweite Mal ist die tatsächliche Verwendung. Ich bin also nicht sicher, warum CF "in verschiedenen Vorlagen" sagt.
Mein nächster Gedanke war, dass das Problem ein rekursiver Aufruf ist, und dass error.cfm ist erroring und die sich selbst, so dass ich versuchte, diese beiden Änderungen, von denen das Problem gelöst haben sollte und entlarvt den wahren Fehler:
<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>
Und:
<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>
Weder gearbeitet. Ich habe auch versucht, diese kurz vor dem Funktionsaufruf der Seite hinzugefügt:
<cfoutput>"#StructKeyExists(variables,"GetCurrentURL")#"</cfoutput>
Es verursachte das Wort „YES“ auf dem Bildschirm gedruckt werden. Dies deutet darauf hin, dass das obige funktionieren sollte, da der Inhalt der if-Anweisung eindeutig mit "YES" bewertet wird, und daher die if-Anweisung als false ausgewertet wird und somit die Funktion nicht deklariert wird und ich somit meine geistige Gesundheit behalten werde. Aber aus irgendeinem Grund bleibt dieses Problem bestehen.
Haben Sie irgendwelche Gedanken darüber, was als nächstes auftreten könnte oder wie Sie den Fehler beheben können? Ich stecke an diesem Punkt fest.
Sind Sie sicher, dass error.cfm nirgendwo enthalten ist? Ist es nur in onError() enthalten? –
Ja, das war nur in onError(). – Nicholas