在我的节点JS后端我对socket.io
进行了一些非常简单的身份验证io.use(async function (socket, next) {
try {
socket.decoded = await db.verifyAuthToken(socket.handshake.query.token, io.secret);
next();
}
catch (err) {
console.error("Socket error validating JWT: " + err);
socket.disconnect();
next(new Error("Socket auth error: No token provided"));
}
});
因此,对于我的日志,错误被成功捕获并处理。在我的客户端(Android)中,我有error
和connect_error
事件的听众:
mSocket.on("error", new Emitter.Listener() {
@Override
public void call(Object... args) {
Log.e(this.getClass().getName(), Arrays.toString(args));
}
});
mSocket.on("connect_error", new Emitter.Listener() {
@Override
public void call(Object... args) {
Log.e(this.getClass().getName(), Arrays.toString(args));
}
});
然而,在调试之后,我意识到当我的后端进行next(new Error())
调用时,这些事件都不会被调用。这可能有什么问题?我希望我的客户能够成功收到此错误。发送/接收事件时,套接字正常工作。
答案 0 :(得分:2)
我认为问题在于您在调用socket.disconnect()
函数之前调用next()
。如果您刚刚断开所有套接字,客户端将如何收到错误事件?
如果你在客户端听"disconnect"
,我想你会在错误的时候得到一些东西。由于您实际上选择断开连接,因此它不会成为"connect_error"
事件。所以我想你必须选择捕获所有断开连接,或者在没有主动断开连接的情况下处理错误。