ws库连接增加了一倍

时间:2019-12-11 02:32:59

标签: javascript node.js express websocket ws

我在连接时遇到问题,我有一个 express服务器,并创建了一个ws实例,该实例传递了 express服务器实例,当我连接时,该连接成功并尝试发送一条消息后,我可以接收到一次消息,当我关闭连接并再次连接然后发送一条消息时,该消息现在发送两次,并且每次执行此操作时,该消息不断加倍,则我在通道上的套接字仅仅是一种联系,我认为它创造了一个新的过程?如何防止这种行为?

/**
	 * New WebScoket instance initialize
	 * @type WebSocket
	 */
	const ws = new WebSocket.Server({ /*verifyClient,*/ server });
	console.log('instantiate');
	const rooms = {};

/**
	 * Add new collection
	 * @param {String} room
	 * @param {String} channel
	 * @param {Object} socket
	 * @returns {Undefined|Null}
	 */
	function add(room, channel, socket) 
	{
		if(typeof rooms[room] == 'undefined') rooms[room] = {};
		if(typeof rooms[room][channel] == 'undefined') rooms[room][channel] = [];
		if(typeof rooms[room][channel] != 'undefined') rooms[room][channel].push(socket);
		redis.subscribe(`${room}-${channel}`);
		return;
	}

	/**
	 * Add new properties to socket
	 * @param {String} room
	 * @param {String} channel
	 * @return {Object}
	 */
	function addPropToSocket(room, channel)
	{
		return {room, channel};
	}

	/**
	 * Send message to user
	 * @param  {String} room
	 * @param  {String} channel
	 * @param  {String} msg
	 * @param  {Object} socket
	 * @return {void}
	 */
	function send(room, channel, msg, socket)
	{
		if(typeof rooms[room] == 'undefined') return;
		if(typeof rooms[room][channel] == 'undefined') return;
		rooms[room][channel].forEach(user => {
			// if(user !== socket && user.readyState === WebSocket.OPEN) user.send(msg);
			if(user.readyState === WebSocket.OPEN) user.send(msg);
		});
	}

	/**
	 * Remove user from room
	 * @param  {String} room
	 * @param  {String} channel
	 * @param  {Object} socket
	 * @return {void}
	 */
	function rm(room, channel, socket)
	{
		if(typeof rooms[room] == 'undefined') return;
		if(typeof rooms[room][channel] == 'undefined') return;
		rooms[room][channel] = rooms[room][channel].filter(user => user != socket);
		// redis.unsubscribe(`${room}-${channel}`);
	}

//@Connection socket connection event
	ws.on('connection', function connection(socket, req) {
		socket.isActive = true;
		const f = formatSocketUrl(req.url);
		socket['props'] = addPropToSocket(...f);
		add(...f, socket);
		socket.on('message', msg => send(...f, msg, socket));
		socket.on('pong', () => socket.isActive = true);
		socket.on('close', () => {
			rm(socket.props.room, socket.props.channel, socket);
		});
		redis.on('message', (channel , msg) => {
			const f = channel.split('-');
			send(...f, msg, socket);
		});
	});

0 个答案:

没有答案