Как я могу предотвратить ошибку при сбросе приложения? - PullRequest
0 голосов
/ 22 февраля 2020

Я получаю сообщение об ошибке

The value of the attribute datasource, which is currently '', is invalid.

Это происходит, когда я вызываю ApplicationStop () для сброса приложения. Мои вызовы cfquery не имеют свойства источника данных, потому что я уже установил его в

this.datasource = "datasourcename"

Как я могу предотвратить эту ошибку?

Обновление:

В скрипте Application.cf c ошибки нет. Ошибка возникает только в теге Application.cf c

, если запрос находится в onRequestStart, ошибка говорит Не удалось найти базу данных источника данных

, если запрос находится в onRequest, ошибка говорит Недопустимое значение источника данных атрибута, который в настоящее время ''.

Информация о сервере: локальная Env: CF11 - Env производства: CF 2018

Application.cf c код

<!--- Application name, should be unique --->
<cfset this.name = hash(getbaseTemplatePath())>
<cfset this.datasource = "database">


<!--- Run when application starts up --->
<cffunction name="onApplicationStart" returnType="boolean" output="false">
    <cfreturn true>
</cffunction>

<cffunction name="onRequest" returnType="void">
    <cfargument name="thePage" type="string" required="true">


    <!--- RESET THE APP --->
    <cfif isdefined("url.reset" )>          
        <cfset ApplicationStop() > 
        <cfset structclear(session)>
        <cfhtmlhead text='<script type="text/javascript">alert("Application was refreshed.");</script>'>
    </cfif>

    <cfquery>
        select top 1 * from security_2fa
    </cfquery>

    <cfinclude template="#arguments.thePage#">
</cffunction>


<cffunction
        name="OnRequestStart"
        access="public"
        returntype="boolean"
        output="false"
        hint="Fires at first part of page processing.">



        <!--- Return out. --->
        <cfreturn true />
</cffunction>

1 Ответ

1 голос
/ 26 февраля 2020

Привет @Vlad Спасибо за ваш код здесь. Я прочитал go вашего кода, и это поможет вам найти root причины ваших проблем. Да, я также сталкиваюсь с той же проблемой, когда тестирую приложение в моем регионе. Причина в том, что вы сделали ApplicationStop () , когда в вашем URL-адресе указано « reset ». Я не знаю, почему вы остановили свою заявку здесь? Обычно мы не останавливаем любое приложение. Вместо этого мы должны переустановить приложение.

Здесь root причина ваших проблем в том, что если вы сделали applicationStop () , то this.name & this.datasource также получите , остановленный или пропавший.

<cfquery>
    select top 1 * from security_2fa
</cfquery>

То есть, как только он будет остановлен, в следующей строке (выше запроса) у вас есть запрос, который не имеет правильного имени источника данных? Потому что он уже остановлен или ушел:).

<cfquery>
    select top 1 * from security_2fa
</cfquery>

<cfif isdefined("url.reset" )>          
    <cfset ApplicationStop() > 
    <cfset structclear(session)>
    <cfhtmlhead text='<script type="text/javascript">alert("Application was refreshed.");</script>'>
</cfif>

Теперь вы никогда не сталкиваетесь с проблемой. Потому что ваш запрос выполняется как до остановки приложения. Но вы можете уйти от этой проблемы только здесь . В случае, если у вашего arguments.thePage есть какой-либо другой запрос, вы также должны столкнуться с той же проблемой. Поэтому, если вы хотите остановить приложение для вашего сценария, вы должны сделать прерывание ( cfabort ), как только остановите приложение. Как показано ниже,

<cfif isdefined("url.reset" )>          
    <cfset ApplicationStop() > 
    <cfabort>
</cfif>

Потому что, если вы остановите приложение, вы не захотите никаких действий, операций или процессов в своих приложениях.

Я могу дать вам другое предложение, то есть вам не нужно останавливать приложение, вместо этого вы можете переустановить приложение. Если вы используете fw1 или coldbox или любой другой фреймворк, тогда используйте опцию fwreinit . Но если вы работаете с обычным MVC, используйте приведенный ниже пример кода

<cfif isdefined("url.reset" )>          
    <cfset onApplicationStart() > 
</cfif>

Надеюсь, это поможет вам больше. Дайте мне знать, все еще нужна помощь или разъяснения. Спасибо!

...