node.js - 对象未在 socket.io 中发送

标签 node.js socket.io

我有以下代码

$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/

相关文章:

node.js - Nodejs内存使用情况

mysql - 如何使用 MySQL 数据库在数据更改时发送更新?

node.js - 套接字.io : best way to find all sockets of a single user

node.js - 使用 Google Cloud Winston Logging (Nodejs) 记录日志之前和结尾处的有趣字符

node.js - Express & Jade - 最大块嵌套

javascript - 拼接后Javascript覆盖数组索引

node.js - JsonWebToken |获取请求验证

javascript - Socket.IO SSL 连接错误不使用express

javascript - 如何在 Meteor.js 中包含第 3 方 javascript 库?

javascript - JScript编译报错nodejs命令行工具