【发布时间】:2020-02-17 10:09:04
【问题描述】:
问题说明
当我们使用.emit() 或.send() 并且我们还想确认消息接收(所谓的acknowledgements)时,我们只需这样写:
socket.emit('someEvent', payload, callback);
这个问题的全部内容是callback 部分。这是很棒的东西,因为它通常允许将一些数据作为响应发送回,而不会发出额外的事件。服务器需要做的就是以适当的方式处理请求:
socket.on('someEvent', (payload, callback) => {
doSomeStuff();
callback(someData);
);
当我们处理成功案例时,这很好用。但是在这些情况下我们该怎么办:
1) 回调不是从客户端发送的/回调不是一个函数,需要从服务器端响应类似 '错误:没有提供回调。用法:...'
例子:
客户端 - socket.emit('someEvent'); 或 socket.emit('someEvent', 1);
服务器端 - socket.on('someEvent', callback => callback());
或
2) 在处理请求时出现问题(例如,验证结果不成功),我们需要以如下方式报告:'未提供有效负载或无效'
例子:
服务器端 -
socket.emit('someEvent', payload, callback => {
checkPayload();
callback(someData);
});
客户端 - socket.on('someEvent', invalidPayload, callback);
问题:是否有一种机制可以从响应方创建自定义回调?
我的工作方式和解决方法
1) 至于缺少的回调或不是函数的回调,我得出的结论是,我只能验证它,然后仅在其有效性的情况下调用它。所以服务器端正在发生一些变化:
socket.emit('someEvent', callback => callback instanceof Function && callback()); //check callback correctness
优点:如果回调不是预期的函数,则不会出现内部错误。
缺点:如果回调无效,客户端将不会被注意到。
2) 至于我们需要发回一些错误的情况,我只找到了一种解决方法来返回一个特定的、事先约定的、虚假的值,比如null,这意味着不能返回任何数据。
socket.emit('someEvent', payload, callback => {
checkPayload();
callback(someData || null); //send falsy, error-like value instead
});
优点:客户通过获取null 会发现一些错误。
缺点:在服务器端,没有简单的中间件函数来验证输入数据并在执行主要逻辑之前返回错误。
我已经考虑过使用中间件来实现所需的功能,但是还没有,可以说,“事件级中间件”,只有在整个 namespace 和 socket 级别上。我是否应该尝试在套接字级别按事件名称过滤事件以附加所需的功能并以next(new Error(...)); 之类的方式发送错误?在这种情况下,我猜可以使用error 事件监听。
socket.io / socket.io-client 使用的版本:2.3.0
【问题讨论】:
标签: javascript node.js sockets npm socket.io