Json 是什么导致JavaScript结构在实时版本中失败,但在测试中仍能正常工作?

Json 是什么导致JavaScript结构在实时版本中失败,但在测试中仍能正常工作?,json,coldfusion,Json,Coldfusion,我在两台服务器上使用ColdFusion 8,两台服务器的ColdFusion版本和设置都完全相同 我们正在CFC中创建一个结构,并使用toScript()函数将其传递给浏览器。网页上生成的JavaScript如下所示: TrackingInfo = new Object(); TrackingInfo["child_catalog_id"] = ""; TrackingInfo["ipaddress"] = "63.123.41.14"; TrackingInfo["parent_catalo

我在两台服务器上使用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"] = "";
var jro = new JS_SessionTracking();
jro.InsertSessionTrackingFunction(TrackingInfo);
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\":\"\"}";
在本页后面的JavaScript中,我们使用CFAJAXPROXY将TrackinInfo结构(如上)传递给相同的CFC,但传递的函数不同,如下所示:

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"] = "";
var jro = new JS_SessionTracking();
jro.InsertSessionTrackingFunction(TrackingInfo);
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\":\"\"}";
在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>
我将结构传递给函数,并使用反序列化JSON函数对其进行解析:

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

尽管如此,此功能在开发和登台时仍能完美工作,但在生产中却失败了

请告诉我为什么会发生这种情况,以及我如何纠正这个问题

更新

我采纳了Jake Feasel的建议,在每个函数的头部添加了
,以确保值不会四处浮动。虽然在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>

#toscript(TrackingInfo.SID,“SID”)#
#toscript(TrackingInfo.parent\u catalog\u id,“parent”)#
#toscript(TrackingInfo.child\u catalog\u id,“child”)#
//创建JAVASCRIPT对象
var jro=new JS_SessionTracking();
InsertSessionTrackingFunction(SID、父级、子级);

查找测试与产品差异的一般故障排除位置:

  • 不同的数据(可能是导致错误的野生字符?)
  • web服务器基础结构差异(反向代理导致缓存 问题;启用了不同的模块;)
  • 浏览器设置(在测试和开发中禁用缓存页面,但在 prod)
  • 服务器配置的额外复杂性(例如不同的 子域(或不同端口),用于承载主页和 Ajax请求;这将引入 问题
  • 然而,现在我们已经排除了这些可能的问题来源,在您的具体案例中

    您说您所有的CF版本都是相同的,并且您正在使用CF8。但是,您尝试使用的“本地”范围是在CF 9中引入的:

    因为(从你的评论)这就是你看到错误的地方,我怀疑这就是问题所在

    更新

    关于在CF8中使用LOCAL,值得一提的一点是,使用它不会引发错误,但很可能会导致意外行为(可能,就像您在这里看到的那样)

    
    
    我已经在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错误,可能仅在生产中设置为抑制。

    CF管理员中有一个名为“前缀序列化JSON with”的设置,默认设置为
    /
    。如果测试和生产系统上的设置不同,则可能会导致问题。

    您说Firebug中没有错误,但也没有响应。那么,您看到Ajax请求被发送到服务器,完整的JSON正文随请求一起发送,但是您得到了一个成功的(200)响应(没有正文)?在生产和测试中可能会有不同的东西-不同的数据(可能是导致错误的野生字符?);web服务器基础架构差异(反向代理导致缓存问题?);浏览器设置(test和dev上禁用了缓存页面,但prod上没有)1)我看到Ajax请求发送时带有格式良好的参数。没有回应。2) 我们已经尝试了很多数据,包括硬编码的数据,这些数据可以用于开发,但不能用于生产。您是否检查了CF/webserver日志,以查看该请求是否确实发送到了webserver?在prod中,您是否可能处理不同的域?如中所示,主页由一个域提供服务,但Ajax请求实际上会转到另一个域(或子域,或不同的端口)?不,我没有检查(不过我会检查)。我们确实知道请求正在发送到函数。如果我们删除函数中的所有内容,然后只执行一次,则会返回true作为Firebug中的响应。函数似乎被阻塞了1)我正在使用局部范围开发一堆新东西(见CF8)。我知道这是一个CF9功能,但它现在仍然可以工作,一旦我们升级到CF10,它就会完美工作。2) 我100%确信这两台服务器使用的是CF 8,0,100000。(这是冷杉