如何将坐标从node.js服务器发送到leaflet.js客户端

时间:2019-01-03 02:50:43

标签: node.js socket.io leaflet

我正在尝试从node.js和socket.io服务器(index.js)发送坐标到client.html。在HTML客户端中,Leaflet将读取坐标。问题是,在client.html中无法读取坐标变量或NaN。

我尝试了一个简单的直接变量初始化,并遵循Socket.IO页面中的教程

服务器(index.js)

var e = require('express')();
var http = require('http').Server(e);
var sio = require('socket.io')(http);

http.listen(3000);

e.get('/', function(req, res) {
    res.sendFile(__dirname + '/public/client.html');
});

sio.on('connection', function(socket) {
    socket.on('ping', function(msg) {
    socket.emit('pong',  {lat:parseFloat(35+Math.random()),lon:parseFloat(-106+Math.random())});
    });
});

客户端(client.html)

var socket = io.connect('http://localhost:3000');
    socket.on('pong', function(msg) {
        console.log("Nilai msg : "+msg);
        L.marker([parseFloat(msg.lat),parseFloat(msg.lon)]).addTo(map).bindPopup("("+msg.lat+","+msg.lon+")").openPopup();



var map = L.map('map', {
    center: [35.10418, -106.62987],
    zoom: 9
});

L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png').addTo(map);

map.on("click", function(){
socket.emit('ping', {msg: 'Hello'});

});

我希望地图将显示具有相应坐标的标记,但实际输出为Error: Invalid LatLng object: (NaN, NaN)

1 个答案:

答案 0 :(得分:3)

在socket.io中,pingpong是保留事件,shouldn't be used in your app是保留事件。您的浏览器在pong事件中收到的不是您期望的:

  

ms(数字)自ping数据包以来经过的毫秒数(即:延迟)。

这就是为什么msg.latmsg.lon未定义且无法解析的原因。

将事件名称更改为其他名称,例如fromserverfrombrowser,您应该可以进行以下操作:

服务器端:

io.on('connection', function(socket){
    socket.on('frombrowser', function(msg){
        var o = {lat:parseFloat(35+Math.random()),lon:parseFloat(-106+Math.random())};
        socket.emit('fromserver', o);
    });
});

客户端:

socket.on('fromserver', function(msg) {
    console.log(msg);
    console.log([parseFloat(msg.lat), parseFloat(msg.lon)]);
});

map.on("click", function(){
    socket.emit('frombrowser', {msg: 'Hello'});
});