2015-12-21 85 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