2012-06-28 92 views
1

我代理的CFC这确实一个ftp“得”到本地临时文件的调用。然后它读取文件,并假定将文件内容作为字符串返回。我知道代码的工作原理,当我将它从cfc中拉出到一个普通的cfm文件中时,它确实完成了预期的工作。然而,在我代理callBackHandler,在CFC结果显示为空值。下面是代理代码:为什么cfreturn为空?

<cfajaxproxy cfc="ftpfunc" jsclassname="jsobj" /> 
    function getFTP() { 
     ... 
     var instance = new jsobj(); 
     instance.setCallbackHandler(ftpSuccess); 
     instance.setErrorHandler(ftpError); 
     instance.setReturnFormat('plain'); 
     instance.getJCL(lpar,remoteFile,userName,password); 
    } 

..然后的callbackHandler,这应该从CFC返回的字符串:

function ftpSuccess(ftpReturn) 
    { 
    // error thrown right here: "ftpReturn is Null" 
     if (ftpReturn.length==0) 
      { alert("Your FTP Get returned a blank file"); } 
    } 

是否有使用特定的语法?例如,当返回类型是一个结构或查询,你必须使用类似ftpReturn.DATA。如何直弦?

感谢所有帮助

编辑:这是CFC

<cffunction name="getJCL" output="false" access="remote" securejson="true"> 
    <cfargument name="lpar" type="string" required="yes"> 
    <cfargument name="remoteFile" type="string" required="yes"> 
    <cfargument name="userName" type="string" required="yes"> 
    <cfargument name="password" type="string" required="yes"> 
    <cfset var ftpReturn = ""> 

    <cfftp action="open" 
     connection="getConnection" 
     password="#arguments.password#" 
     secure="yes" 
     server="#arguments.lpar#" 
     stopOnError="no" 
     timeout="30" 
     username="#arguments.username#"> 

    <cfset tempFile="D:\myDir\#RandRange(10000000,99999999)#.tmp"> 

    <cfftp action="getFile" 
     connection="getConnection" 
     localFile="#tempFile#" 
     remoteFile="#arguments.remoteFile#" 
     transferMode="auto"> 

    <cffile action = "read" file = "#tempFile#" variable = "Message"> 

    <cfset ftpReturn = Message> 

    <cfreturn ftpReturn> 
</cffunction> 
+5

显示cfc,以便我们可以看到返回的beig。 – Paul

+0

安装的Fiddler(http://fiddler2.com)并用它来观看请求/响应。检查员(Fiddler UI的右下角四分之一)有一个JSON选项卡,它将显示正在返回的数据的结构。如果没有显示任何内容,请使用RAW选项卡准确显示服务器返回的内容。这将让你知道它是否是一个服务器或客户端的问题 – barnyr

+0

以我的经验,你得到空值,如果变量被deinstantiated。因此,如果CFFILE读取长度为0的文件,则Message可能会将Java指针指向null。 – Salsero69

回答

0

如果我删除的callbackHandler功能,我可以在Firebug的实际文件的控制台\ Response选项卡看内容,这是“测试”
...
我已经安装了提琴手也在JSON标签下我只得到“该响应不包含有效的JSON文本”

所以您目前没有返回有效JSON?

它可能会或不会在CF,它如果收到无效的内容(而不是抛出一个错误),但更改文件内容的东西,validates,也许它会工作传递空的错误吗?


你也可以尝试像...

<cftry> 
    <cfset deserializeJson(ftpReturn) /> 
    <cfcatch> 
     <cfset ftpReturn = '{"error":"invalid json"}' /> 
    </cfcatch> 
</cftry> 

...在函数内部检测,如果它是有效的JSON,如果不返回相应的消息。


不要忘记你的CFCOMPONENT标签本身需要output=false,否则你还是可能从空白职能以外的面积增加。


一对夫妇的其他东西 - 你不实际使用Message变量,所以只是做:

<cffile action = "read" file = "#tempFile#" variable = "ftpReturn"> 

此外,随机数是保证是唯一的,所以有一个小除非您切换到:

<cfset tempFile="D:\myDir\#createUuid()#.tmp"> 
+0

谢谢,我试过你所建议的一切。 json错误陷阱没有得到任何东西,空错误是相同的。将cfc函数returnformat更改为“plain”,以便匹配js函数中的语句(阻止cfc对序列化结果),结果相同。 – ion

+0

如果你改变了JS以'instance.setCallbackHandler(函数(){执行console.log(参数)})的相应行会发生什么;'? –

+0

它返回0 \t空未定义 – ion