Coldfusion "Рутины не могут быть объявлены более одного раза" - PullRequest
2 голосов
/ 02 апреля 2012

В нашем 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>

Это все часть скрипта, который собирает кучу подробностей об ошибке и записывает ее в базу данных.

При возникновении ошибки мы получаем сообщение «Процедура GetCurrentURL была объявлена ​​дважды в разных шаблонах». Однако я искал всю кодовую базу несколькими различными способами и обнаружил, что «GetCurrentURL» используется только дважды, оба раза в error.cfm. Первый раз - декларация, а второй - фактическое использование. Поэтому я не уверен, почему CF говорит «в разных шаблонах».

Моей следующей мыслью было, что проблема в рекурсивном вызове, и что 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>

Это привело к тому, что слово «ДА» было напечатано на экране. Это указывает на то, что вышеприведенное должно работать, так как ясно, что содержание оператора if будет оцениваться как «ДА», и, следовательно, оператор if будет оцениваться как false, и, таким образом, функция не будет объявлена, и, таким образом, я сохраню свое здравомыслие. Но по какой-то причине эта проблема сохраняется.

Есть какие-нибудь мысли о том, что может произойти или как устранить неисправность дальше? Я застрял в этой точке.

Ответы [ 2 ]

3 голосов
/ 02 апреля 2012

ColdFusion по-прежнему видит объявление функции, когда компилирует ее в байт-код. Вы можете использовать cfinclude для включения объявления функции:

<cfif StructKeyExists(variables,"GetCurrentURL") IS "NO">
<cfinclude template="udf.cfm" />
</cfif>

Затем в udf.cfm поместите объявление вашей функции. Это должно работать так, как вы хотите, чтобы CF не выдавал ошибку.

0 голосов
/ 19 января 2017

Другим решением является удаление функции из области видимости перед определением.Например ...

<cfset StructDelete(variables,'myFunction')>
<cffunction name="myFunction">...</cffunction>
...