我有以下代码
$locationButton.onclick = () => {
if(!navigator.geolocation) { return alert('method unavailable'); }
$locationButton.setAttribute('disabled', 'disabled');
navigator.geolocation.getCurrentPosition((position) => {
console.log(position)
$locationButton.removeAttribute('disabled');
socket.emit('USER:SEND_LOCATION', position, (response) => {
console.log(response)
});
})
}
在服务器上
socket.on('USER:SEND_LOCATION', (position: any, callback: Function) => {
console.log(position)
const timestamp = Date.now();
socket.broadcast.emit('SERVER:NEW_LOCATION', {position, timestamp, user: 'Me'});
callback({position, timestamp, user: 'Me'});
})
我遇到的问题是,在客户端中,第一个 console.log 上有一个位置对象,然后我尝试将其发送给服务器,而服务器总是只得到一个空对象,而不是“{}”
我尝试了 json.strigify,但我仍然得到一个“{}”
最佳答案
通过调用 navigator.geolocation.getCurrentPosition
获得的 position
对象/结果的问题是它的属性不可枚举,这意味着您无法轻松地“字符串化”该对象并将其与您的 socket.emit
调用一起传递,这就是您得到一个空对象的原因。
虽然您可以编写一个函数来为您提取这些属性,但您可以执行以下操作:
navigator.geolocation.getCurrentPosition((position) => {
const payload = {
coords: {
accuracy: position.coords.accuracy,
altitude: position.coords.altitude,
altitudeAccuracy: position.coords.altitudeAccuracy,
heading: position.coords.heading,
latitude: position.coords.latitude,
longitude: position.coords.longitude,
speed: position.coords.speed
},
timestamp: position.timestamp
}
socket.emit('USER:SEND_LOCATION', JSON.stringify(payload))
})
然后,在您的服务器端,您可以执行以下操作:
socket.on('USER:SEND_LOCATION', (position, callback) => {
const data = JSON.parse(position)
console.log(data) // { coords: {...}, timestamp: ... }
})
<小时/>
如果您想要一个更简洁的解决方案,请看一下这个函数,它将获取 position
对象并将其转换为可以轻松“字符串化”的对象:
关于node.js - 对象未在 socket.io 中发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57448684/