gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:26:54 25 4
gpt4 key购买 nike

我在两台服务器上使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com