Socket.io iOS 设备和 Node.js 服务器之间的 ack 不工作

Socket.io with ack between iOS device and Node.js server not working

我有一个项目,其中有一个 iOS Objective-C 应用程序试图与 Node.js 服务器通信。我在 node.js.

上使用 socket.io (iOS) and socket.io

我要解决的问题是从设备向服务器发送消息,并让服务器return 做出响应。为此,我试图通过发送一条消息并期待包含设备所需数据的确认来做到这一点。

设备代码如下所示:

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 代码如下所示:

var SocketIO = require('socket.io');
var io = SocketIO(8099);

io.on('connection', function(socket) {
    socket.on('ListProjects', function(data, getProjectsCallback) {
        database.allProjects(function getAllProjectsCallback(err,  rows) {
            getProjectsCallback(rows);
        });
    });
});

当我尝试 运行 时,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,但不知何故它没有被传递给回调。

不确定这是错误还是协议限制,但是当您将空数组传递给 emitWithAck:withItems: 时它不起作用。您会看到服务器端 data 包含您的回调函数,而不是您期望的 getProjectsCallback

所以,两个选项:

  • 在那种情况下,认识到您的侦听器处理程序的第一个参数将是回调,而不是第二个
  • 或将任何随机数据添加到项目数组(例如 @[@"x"]

我想我会选择第二个选项,以防将来有人解决这个问题。