首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是什么导致JavaScript结构在活动版本中失败而在测试中工作?

是什么导致JavaScript结构在活动版本中失败而在测试中工作?
EN

Stack Overflow用户
提问于 2012-03-15 18:47:38
回答 2查看 224关注 0票数 3

我在两个服务器上使用ColdFusion 8,它们都具有完全相同的ColdFusion版本和相同的设置。

我们正在CFC中创建一个结构,并使用toScript()函数将其传递给浏览器。网页上产生的JavaScript如下所示:

代码语言: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结构(上面)传递给相同的CFC --但是使用不同的函数--使用如下所示的CFAJAXPROXY:

代码语言:javascript
复制
var jro = new JS_SessionTracking();
jro.InsertSessionTrackingFunction(TrackingInfo);

在CFC中,InsertSessionTrackingFunction函数接受结构并将其输入数据库,

代码语言:javascript
复制
<!--- 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。萤火虫没有显示错误。不返回真实值。

是什么原因导致CFC不喜欢在活动环境中传递给它的结构,但是在开发环境中工作得非常好?

此外,在传递页面之前,我尝试使用ColdFusion函数serializeJSON()对结构进行格式化。它以如下方式输出到页面:

代码语言:javascript
复制
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函数解析它:

代码语言:javascript
复制
<cfset LOCAL.TrackingInfo = deserializeJSON(LOCAL.TrackingInfo)>

尽管如此,这个函数在开发和阶段中仍然工作得很好,但是在生产中失败了。

请给我一些关于为什么会发生这种情况以及我如何纠正这个问题的想法。

更新

我采纳了Jake的建议,并在每个函数的头上添加了<cfset var LOCAL = {}>,以确保值不会浮动。虽然在CF8中这似乎是一个很好的习惯,但这并没有解决问题。

下面的代码在生产和我们的生活环境中工作得很好。不需要对CFC进行任何修改来完成这项工作。ColdFusion只是不允许将该结构传递到该服务器上的函数中。

代码语言:javascript
复制
<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>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-15 19:02:09

常见的故障排除位置,以查找测试与刺激之间的差异:

  1. 不同的数据(可能是导致错误的野生字符?)
  2. web服务器基础结构差异(反向代理导致缓存问题;启用不同模块;)
  3. 浏览器设置(在测试和开发中禁用缓存的页,而不禁用prod)
  4. 服务器配置(例如,不同的子域或不同端口)中承载主页面和Ajax请求的额外复杂性;这将带来同源政策问题。

然而,既然我们已经排除了那些可能的问题来源,在你的具体情况下.

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

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

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

更新

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

代码语言:javascript
复制
<cffunction name="foo">
    <cfset local.bar = "Hello World">

    <cfreturn local.bar>
</cffunction>

我已经在CF8中测试了上面的示例,它“工作”--它不会抛出错误。但是,它要做的是在请求或组件的变量范围中创建一个名为“local”的新结构(取决于函数驻留的位置)。然后,它将在该上下文中全局可用(如果您正在缓存CFC实例,则可能会持续)。如果这是一个共享的、缓存的CFC实例,那么如果您同时从多个客户端访问这个实例(如果函数长期运行的话),那么您将用每个请求覆盖这个局部变量。--这只是在开发或分阶段过程中不容易发现的问题,因为同时访问该站点的用户较少。也是,如果您在不同的函数中使用相同的名称,每个名称都可能与您正在运行的实例发生冲突,从而导致谁知道是什么样的问题。

最好的方法是通过添加一行来更新您的功能:

代码语言:javascript
复制
<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错误,可能只有在生产时才会设置为抑制错误。

票数 2
EN

Stack Overflow用户

发布于 2012-03-15 22:39:47

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9726176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档