gpt4 book ai didi

node.js - 服务器重启后 Angular 6 验证客户端 socket.io socketio-jwt

转载 作者:搜寻专家 更新时间:2023-11-01 00:50:12 24 4
gpt4 key购买 nike

我想在服务器端验证每个 socket.io 事件。当我首先打开 Angular 页面时,调用方法 initSocket(login: Login),没问题。身份验证成功,我可以向服务器发送消息。但是,如果我重新启动服务器,angular 通过 Htttp 重新连接到服务器,但无法通过 socketio 发送消息。在我的服务器中,日志中没有消息。似乎 socketio-jwt 阻止了客户端消息。如果我在客户端按 F5,它仍然可以。不刷新页面如何解决?在建立连接后,我似乎必须向客户端的每个事件传递一个 token ,但我不知道该怎么做。

Angular 6:

    public initSocket(login: Login): void {
this.socket = socketIo(SERVER_URL);
console.log('Socket init at' + SERVER_URL);
this.socket.emit('authenticate', { token: this.login.token });
this.socket.on('authenticated', function () {
console.log('socket is jwt authenticated');
});
this.socket.on('unauthorized', function (error, callback) {
if (error.data.type === 'UnauthorizedError' || error.data.code === 'invalid_token') {
// redirect user to login page perhaps or execute callback:
callback();
console.error('Users token has expired');
}
});

this.socket.on('disconnect', function (error) {
console.error('socket disconnect', error);
});

this.socket.on('connect_failed', function (error) {
console.error('socket connect_failed');
});
}

服务器端:

io.sockets
.on('connection', socketioJwt.authorize({
secret: environment.secret,
timeout: 15000,
callback: false
})).on('authenticated', function (socket) {
clients[socket.decoded_token.id] = socket.decoded_token.login;
console.error('Connected: ', socket.decoded_token.login);

socket.on('message', async function (data) {
try {
// Проверка что пользователь пишите от себя
if (data.from === socket.decoded_token.id) {
data.totalCount = await db_helper.saveMessage(data);
if (clients[data.from] && clients[data.to]) {
io.sockets.connected[clients[data.to].socket].emit("message", data);
console.log("Sending from: " + clients[data.from].name + " to: " + clients[data.from].name + " '" + data.text + "'");
} else {
console.log('User does not exist: from=>', data.from, ':', clients[data.from], 'to=>', data.to, ':', clients[data.to]);
}
}
}
catch (error) {
console.error(error.message);
}
});

//Removing the socket on disconnect
socket.on('disconnect', function () {
});
});

enter image description here

最佳答案

这是因为每当你的服务器/客户端离线时,一个新的套接字被创建用于重新连接目的并建立一个新的连接,即重新连接,服务器断开所有它以前与同一个客户端的连接,这个过程是异步的,因此开发人员不容易看到。

我还会检查我的套接字重新连接是否重新连接到,默认情况下套接字重新连接到您的客户端连接到的端口。

如果是这种情况,那么您需要在 io(套接字管理器)的帮助下重新连接

也有可能是你的client re connection设置为false,你可以通过consoling查看你的socket属性,如下:

this.socket.on('disconnect', function (error) {
console.log('disconnected', this)
//this sets whether the re connection is allowed or not
this.io._reconnection = true;
});

this.socket.on('reconnect', (error, callback) => {
console.log('reconnect succesfully', this);
//connect to the previously connected socket.
this.io.socket.reconnect()
});

关于node.js - 服务器重启后 Angular 6 验证客户端 socket.io socketio-jwt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53115912/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com