保持http请求结果的变量未定义

时间:2010-10-05 15:38:50

标签: http variables coldfusion undefined

在我的代码中,我正在发出一个http请求(使用cfhttp)并将结果存储在一个变量中。 http请求确实返回结果 - 我知道这一点,因为我正在记录请求的时间和结果。

然而,有时将某个http请求(cfhttp.filecontent)的结果存储在变量中会出现问题,因为稍后,当我将另一个变量设置为第一个变量时,第一个变量偶尔会抛出一个错误( “元素insurance_233在作为表达式的一部分引用的CFML结构中未定义。”)。当我转出会话变量时,元素肯定不存在。我无法弄清楚导致错误发生的原因。

这是代码(略有修改,但实质上足以说明我正在谈论的内容。修改被添加进来希望它能解决错误。此外,我随后更改了“inurance”& #myNum #对于语法更正确的“保险#myNum#”,但是对于这个插图,我把它保留在原始状态,以显示它是最后一次抛出错误。):

<cfloop query="myQuery"> <!--- one of the query columns is myNum--->
    <cflock scope="session" type="exclusive" timeout="10">
        <cfset session.report.mydata["insurance_" & #myNum#] = cfhttp.filecontent>
    </cflock>
    <cfset request.report.mydata["insurance_" & #myNum#] = trim(session.report.mydata["insurance_" & #myNum#])>
</cfloop>

4 个答案:

答案 0 :(得分:2)

除非您使用的是CF5或更低版本,否则您不需要使用范围锁定。我不再使用锁,除非它们被命名为特定竞争条件的锁。此外,如果您在没有完成写入的情况下锁定达到10秒,它将完全绕过写入,您将无法知道它。这可能就是发生了什么。尝试将“throwontimeout = true”添加到cflock中,超过超时时会出错,而不是忽略写入。

答案 1 :(得分:2)

如果这是在CFC中,你是否写过

<cfset var myNum=0>

在同一方法的某个时刻?

答案 2 :(得分:2)

您没有锁定负责设置myNum值的逻辑。如果同时处理多个请求,您可能会遇到以下情况。

Request 1: sets myNum to 33
Request 1: writes data to session using myNum as the index; i.e. session[33]
Request 2: sets myNum to 34 
Request 1: reads data from session using myNum as the index; i.e. session[34]
Request 2: writes data to session using myNum as the index; i.e. session[34]

因此,请求1尝试从未定义的位置读取,因为请求2已增加索引/ myNum但未写入任何数据。

答案 3 :(得分:1)

上面的代码没有提供太多的上下文,但是您是从同一个应用程序范围读取会话吗?