2012-06-28 130 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