json - 是什么导致 JavaScript 结构在实时版本中失败但在测试中有效?

标签 json coldfusion

我在两台服务器上使用 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 中,我们使用 CFAJAXPROXY 将 TrackingInfo 结构(上图)传递给同一个 CFC——但不同的函数:

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) 外,它的每个方面都可以正常工作。我们的服务器拒绝处理从网页传递给 CFC 的 JavaScript。 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)>

尽管如此,此功能在开发和暂存中完美运行,但在生产中失败。

请给我一些想法,说明为什么会发生这种情况以及我如何解决这个问题。

更新

我采纳了 Jake Feasel 的建议并添加了 <cfset var LOCAL = {}>在每个函数的头部,以确保值不会四处 float 。虽然在 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>

最佳答案

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

  1. 不同的数据(可能是导致错误的通配符?)
  2. 网络服务器基础架构差异(反向代理导致缓存 问题;启用了不同的模块;)
  3. 浏览器设置(缓存页面在测试和开发中禁用,但在 产品)
  4. 服务器配置的额外复杂性(例如不同的 子域或不同的端口)用于托管主页和 Ajax 请求;这将介绍 Same origin policy 问题。

但是,既然我们已经消除了在您的具体案例中可能出现问题的原因....

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

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

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

更新

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

<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 错误的全局错误处理程序,可能设置为仅在生产中抑制。

关于json - 是什么导致 JavaScript 结构在实时版本中失败但在测试中有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9726176/

相关文章:

json - 如何在ActionScript3中解析node.js REST api对象

java - 尝试将 Object 转换为 MapEntry 时出现 ClassCastException

javascript - 将现有数组转换为新数组

ColdFusion 哈希标记的 vim 语法高亮显示

jquery - 我的 CFC 的 JSON 响应返回 HTML 代码

javascript - 在 JS 中从 JSON 对象检索数据

java - 使用 Jackson 解析 json

rest - 连接到 Paypal Rest Api 以获得用户同意

oracle - ColdFusion - 重复的 POST 被解雇

oauth - 如何在 ColdFusion 9 中签署 Quickbooks 在线 API 请求?