2015-12-21 71 views
0

我有一個項目,其中有一個iOS Objective-C應用程序試圖與Node.js服務器交談。我在node.js上使用socket.io (iOS)socket.ioSocket.io在iOS設備和Node.js服務器之間不起作用

我想解決的問題是從設備獲取消息到服務器,並讓服務器返回響應。爲此,我試圖通過發送一條消息並預期包含該設備之後的數據的確認來做到這一點。

設備代碼如下所示:

void (^serverAck)(uint64_t, void (^)(NSArray *)) = [_socket emitWithAck:@"ListProjects" withItems:@[]]; 

serverAck(0, ^(NSArray* data) { 
    if ([data count] == 0) { 
     NSError *error = [NSError errorWithDomain:@"CRXServer" code:1 userInfo:nil]; 
     failureBlock(error); 
    } else { 
     successBlock(data); 
    } 
}); 

而且Node.js的代碼如下所示:

​​

當我嘗試運行此,getProjectsCallback崩潰的服務器,因爲它是不一個函數。從另一個線程發表的意見中,我明白如果對服務器的調用是正確的並且期待一個確認,這將是一個函數。

任何人都知道我做錯了什麼?

P.S.她是從socket.o日誌轉儲顯示收到的請求:

engine:socket packet +0ms 
    socket.io-parser decoded 20["getProjects"] as {"type":2,"nsp":"/","id":0,"data":["getProjects"]} +14ms 
    socket.io:socket got packet {"type":2,"nsp":"/","id":0,"data":["getProjects"]} +15ms 
    socket.io:socket emitting event ["getProjects"] +0ms 
    socket.io:socket attaching ack callback to event +0ms 
Getting all projects ... 
Releasing connection 
Got the project list 
/Users/derekclarkson/projects/crux-Server/node_modules/mysql/lib/protocol/Parser.js:82 
    throw err; 
    ^

TypeError: getProjectsCallback is not a function 
at getAllProjectsCallback (/Users/derekclarkson/projects/crux-Server/Server.js:20:13) 
at Query.executeCodeblockCallback [as _callback] (/Users/derekclarkson/projects/crux-Server/Database.js:321:17) 

所以看起來socket.io是否附着一個ACK,但不知何故,它沒有被傳遞給回調。

回答

1

不知道它是一個錯誤還是一個協議限制,但是當您將一個空數組傳遞給emitWithAck:withItems:時它不起作用。您會看到服務器端data包含您的回調函數,而不是您所期望的getProjectsCallback

所以,有兩個選項:

    在這種情況下
  • ,認識的第一個參數到您的收聽處理器將是回調,而不是第二
  • 或任何隨機數據添加到項目陣列(例如@[@"x"]

我想我會去第二個選項,以防有人在將來修復這個問題。

+0

Doh。當我想到這一點時,很明顯。現在它正在工作。謝謝。 – drekka

相關問題