自定义 Socket.IO 中间件错误事件?

7

Socket.IO允许中间件函数传递错误。

var io = require('socket.io')();
io.use(function(socket, next){
    if (socket.request.headers.cookie) return next();
    next(new Error('Authentication error'));
});

客户端可以通过监听默认的“error”事件来捕获这些错误。
clientIO.on('error', function(err) {
    console.log(err);
}

是否有办法使Socket.IO中间件发出自定义事件名称而不是“error”(例如,“authentication_error”)?

2个回答

8

根据我在代码库中看到的情况,好像不是这样的。错误消息通过一种特殊的数据包类型发送,触发客户端的error事件,因此在这方面它不是常规消息(你不能用另一种类型替换它)。

不过,你可以选择将数据与错误一起传递:

// server
io.use(function(socket, next){
  if (socket.request.headers.cookie) return next();
  let err  = new Error('Authentication error');
  err.data = { type : 'authentication_error' };
  next(err);
});

// client
clientIO.on('error', function(err) {
  if (err.type === 'authentication_error') {
    ...
  } else {
    ...
  }
}

2
看起来服务器发出的错误消息是"身份验证错误",而不是整个错误对象,所以无法访问错误的其他属性。不确定这是否与其他问题无关。 - user2901933
1
使用当前版本的 socket.io (1.4.8),对我来说似乎完全正常。这里是一个代码片段,是我测试过的代码。我相信你需要使用 err.data,而不是像 err.type 或其他随机属性一样。 - robertklep
我知道这个问题已经被问了很长时间,但这是我的变化:// 服务器 io.use(function(socket, next){ if (socket.request.headers.cookie) return next(); const errorMessage = JSON.stringify( new AuthenticationError() ); next ( new Error( errorMessage ) ); });// 客户端 socket.on( 'connect_error', ( err: any ) => { let error = err.toString().split( 'Error:' )[ 1 ].trim(); error = JSON.parse( error ); // 对错误对象进行任何操作 } ); - Selam Getachew

0
如果有人想知道上面的代码似乎不起作用,因为API已经改变了。
socket.on("connect_error", (err) => {
  console.log(err.message); // prints the message associated with the error
});

链接: 中间件

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接