Я пытаюсь создать систему отслеживания в режиме реального времени с использованием веб-сокетов, я могу получить координаты пользователя и поместить маркер на карту, но я не хочу, чтобы один пользователь видел маркеры других пользователей.Я примерно знаю, что мне нужно для использования io.to (), но не знаю, как именно его использовать.И еще один мой вопрос: когда я закрываю HTML-страницу, я не получаю отключенное сообщение в методе socket.on («отключение»).Может кто-нибудь, пожалуйста, помогите здесь.
JS-Viewer.js на стороне клиента
let map;
let markers = new Map();
document.addEventListener('DOMContentLoaded', () => {
const socket = io('/');
const positionOptions = {
enableHighAccuracy: true,
maximumAge: 0
};
setInterval(() => {
navigator.geolocation.getCurrentPosition(pos => {
console.log("came inside set interval first one");
const { latitude: lat, longitude: lng } = pos.coords
socket.emit('updateLocation', { lat, lng })
}, err => {
console.error(err)
}, positionOptions)
}, 2000);
socket.on('locationsUpdate', locations => {
console.log(locations);
// myMap.forEach(function(value, key) {
// console.log(key + ' = ' + value);
// });
markers.forEach((marker,id) => {
marker.setMap(null)
markers.delete(id)
});
locations.forEach(([id, position]) => {
if (position.lat && position.lng) {
var image = 'https://developers.google.com/maps/documentation/javascript/examples/full/images/beachflag.png';
const marker = new google.maps.Marker({
position:position,
map:map,
icon:image
})
markers.set(id, marker)
console.log(markers);
}
})
});
setInterval(() => {
console.log("came inside setInterval, calling requestLocations");
socket.emit('requestLocations')
}, 2000);
});
function initMap() {
console.log("came inside init map");
navigator.geolocation.getCurrentPosition(pos => {
const { latitude: lat, longitude: lng } = pos.coords
map = new google.maps.Map(document.getElementById('map'), {
center: { lat, lng },
zoom: 20
})
}, err => {
console.error(err)
})
}
На стороне сервера, ниже код
const http = require('http')
const path = require('path')
const express = require('express')
const bodyParser = require('body-parser')
const socketIo = require('socket.io')
const app = express()
const server = http.createServer(app)
const io = socketIo(server)
const locationMap = new Map()
app.use(express.static(path.join(__dirname, 'public')))
app.get('/', (req, res) => {
res.send('Hello');
})
io.on('connection', socket => {
socket.on('updateLocation', pos => {
locationMap.set(socket.id, pos)
})
socket.on('requestLocations', () => {
console.log(locationMap);
console.log(Array.from(locationMap));
socket.emit('locationsUpdate', Array.from(locationMap))
})
socket.on('disconnect', () => {
console.log("disconnected");
locationMap.delete(socket.id)
})
})
server.listen(3000, err => {
if (err) {
throw err
}
console.log('server started on port 3000')
})