Что приводит к сбою структуры JavaScript в живой версии, но при тестировании? - PullRequest
3 голосов
/ 15 марта 2012

Я использую ColdFusion 8 на двух серверах с одинаковой версией ColdFusion и одинаковыми настройками.

Мы создаем структуру в CFC и передаем ее в браузер с помощью функции toScript (),Результирующий JavaScript на веб-странице выглядит следующим образом:

TrackingInfo = new Object();
TrackingInfo["child_catalog_id"] = "";
TrackingInfo["ipaddress"] = "63.123.41.14";
TrackingInfo["parent_catalog_id"] = 1642;
TrackingInfo["session_id"] = 30000390;
TrackingInfo["referral"] = "";
TrackingInfo["useragent"] = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) G    ecko/20100101 Firefox/10.0.2";
TrackingInfo["querystring"] = "";

Позже на странице JavaScript мы передаем структуру TrackingInfo (ABOVE) тому же CFC, но другой функции, используя CFAJAXPROXY.как это:

var jro = new JS_SessionTracking();
jro.InsertSessionTrackingFunction(TrackingInfo);

В CFC функция InsertSessionTrackingFunction принимает структуру и вводит ее в базу данных,

<!--- INSERT SESSION TRACKING FUNCTION --->
<cffunction name="InsertSessionTrackingFunction" access="remote">
    <cfargument name="TrackingInfo" required="true">
    <cfset LOCAL.TrackingInfo = ARGUMENTS.TrackingInfo>
    // DATABASE STUFF HAPPENS HERE
    <cfreturn true>
</cffunction>

На наших сайтах разработки и стадии это работает без нареканий, провереново многих машинах и многих браузерах.Он работает так, как задумано и желательно.

Когда мы переносим код в рабочий процесс, каждый его аспект работает, за исключением самой последней функции (InsertSessionTrackingFunction).Наш сервер отказывается обрабатывать JavaScript, переданный CFC с веб-страницы.Firebug не показывает ошибок.Истинное значение НЕ возвращается.

Что может привести к тому, что CFC не понравится структура, переданная ему в настройке LIVE, но будет отлично работать в настройке разработки?

Также я попытался использоватьфункция ColdFusion serializeJSON () для форматирования структуры перед передачей ей страницы.Он выводил на страницу примерно так:

LOCAL.TrackingInfo = serializeJSON(LOCAL.TrackingInfo); // serialize the structure

TrackingInfo = "{\"CHILD_CATALOG_ID\":\"\",\"IPADDRESS\":\"63.173.41.14\",\"PARENT_CATALOG_ID\":1642,\"SESSION_ID\":30000390,\"REFERRAL\":\"\",\"USERAGENT\":\"Mozilla\\/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko\\/20100101 Firefox\\/10.0.2\",\"QUERYSTRING\":\"\"}";

Я передал структуру функции и использовал функцию deserializeJSON для ее анализа:

<cfset LOCAL.TrackingInfo = deserializeJSON(LOCAL.TrackingInfo)>

Тем не менее, эта функция отлично работает в разработкеи постановка, но не в производстве.

Пожалуйста, дайте мне несколько идей относительно того, почему это может происходить и как я могу исправить проблему.

ОБНОВЛЕНИЕ

Я воспользовался советом Джейка Физеля и добавил <cfset var LOCAL = {}> в заголовок каждой функции, чтобы убедиться, что значения не распространяются.Хотя это кажется хорошей привычкой в ​​CF8, это не решило проблему.

Приведенный ниже код прекрасно работает как на производстве, так и в реальной среде.Никаких изменений в CFC не потребовалось, чтобы сделать эту работу.ColdFusion просто не позволит передать эту структуру в функцию на этом сервере.

<script>
  <cfoutput>
        #toscript(TrackingInfo.SID, "SID")# 
        #toscript(TrackingInfo.parent_catalog_id, "Parent")#
        #toscript(TrackingInfo.child_catalog_id, "Child")#
  </cfoutput>

  // CREATE JAVASCRIPT OBJECT
  var jro = new JS_SessionTracking();
  jro.InsertSessionTrackingFunction(SID,Parent,Child); 
</script>

Ответы [ 2 ]

2 голосов
/ 15 марта 2012

Общие места устранения неполадок для поиска различий между тестами и продуктами:

  1. разные данные (может быть дикий символ, вызывающий ошибку?)
  2. Различия в инфраструктуре веб-сервера (обратный прокси вызывает кеш проблемы; включены разные модули;)
  3. настройки браузера (кэшированные страницы отключены при тестировании и разработке, но не при включении прод)
  4. Дополнительные сложности в конфигурации сервера (например, разные субдомены или другие порты) для размещения главной страницы и Запросы Ajax; это введет Такая же политика происхождения проблемы.

Однако теперь, когда мы исключили эти возможные источники проблем в вашем конкретном случае ...

Вы говорите, что все ваши версии CF одинаковы и что вы используете CF 8. Однако «локальная» область действия, которую вы пытаетесь использовать, была введена в CF 9:

http://forta.com/blog/index.cfm/2009/6/21/The-New-ColdFusion-LOCAL-Scope

Поскольку (из вашего комментария) именно здесь вы видите ошибку, я подозреваю, что это проблема.

Обновление

Одна вещь, которую стоит упомянуть относительно использования LOCAL в CF8 - его использование не выдаст ошибку, но в результате может произойти неожиданное поведение (возможно, как вы видите здесь).

<cffunction name="foo">
    <cfset local.bar = "Hello World">

    <cfreturn local.bar>
</cffunction>

Я протестировал приведенный выше пример в CF8, и он «работает» - он не выдает ошибку. Тем не менее, он будет создавать новую структуру с именем 'local' в области переменных для запроса или компонента (в зависимости от того, где находится функция). Затем он будет доступен глобально в этом контексте (и, возможно, будет постоянным, если вы кэшируете экземпляр CFC). Если это общий, кэшированный экземпляр CFC, вполне вероятно, что если вы нажмете это на нескольких клиентах одновременно (особенно это заметно, если функция выполняется долго), то вы будете перезаписывать эту локальную переменную при каждом запросе. , Это просто проблема, которая не будет очевидна при разработке или постановке, так как на сайт сразу попадает меньше пользователей. Кроме того, если вы используете одно и то же имя в разных функциях, каждая из них потенциально может конфликтовать с запущенным экземпляром, вызывая кто-знает, какие проблемы.

Лучше всего было бы обновить вашу функцию, добавив одну строку:

<cffunction name="InsertSessionTrackingFunction" access="remote">
    <cfargument name="TrackingInfo" required="true">
    <cfset var LOCAL = {}>
    <cfset LOCAL.TrackingInfo = ARGUMENTS.TrackingInfo>
    // DATABASE STUFF HAPPENS HERE
    <cfreturn true>
</cffunction>

Это явно ограничит вашу локальную область видимости вашей функцией.

Возможно, вы не видите ошибки в firebug, потому что, возможно, у вас есть какой-то глобальный обработчик ошибок, который подавляет ошибки CF, возможно, настроенный на подавление только в рабочем состоянии.

1 голос
/ 16 марта 2012

В CF Administrator есть настройка, которая называется «Префикс сериализованного JSON с», и по умолчанию используется //. Если этот параметр отличается в ваших системах тестирования и производства, это может вызвать проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...