【问题标题】:Using callback function in websocket api javascript在 websocket api javascript 中使用回调函数
【发布时间】:2020-03-07 16:01:32
【问题描述】:

我有一个使用 websocket api for javascript 的 websocket 客户端,而我的服务器正在使用 socket.io

我正在尝试这样的回调函数

客户端 js 使用内置 javascript WebSocket api


//im formatting the string like that because thats what socket.io needs for some reason

  var sendString = '42' + JSON.stringify(['checkLogin' , username, password])
    socket.send(sendString, function(returnData){
      console.log(returnData);
      resolve(returnData);
    })

但我不断收到一个错误,即回调不是我的服务器端使用 socket.io 的函数,看起来像这样

服务器 js 使用 socket.io 库


socket.on('checkLogin', function(username, password, callback){
  console.log(username, password)
  webUser.findOne({username:username}, function(err, docs) {
    console.log(docs)
    if(docs){
      if(docs.password == password){
        callback(docs._id)
      }else{
        callback(false)
      }
    }
    if(!docs){
      callback(false)
    }
  });
})

我可以改变什么来正确设置回调函数

【问题讨论】:

  • 您使用的是哪个 websocket 库?请为您正在使用的确切 webSocket 库发布 NPM 页面的链接。
  • 我正在使用浏览器内置的 websocket API。我正在测试它会在一个 HTML 文件中,但对于构​​建 tabris 应用程序,它使用相同的 api
  • 服务器端?你说错误是“回调不是函数”服务器端所以我问你在服务器上使用什么库。而且,如果您需要有关服务器端错误的帮助,您必须向我们展示相关的服务器端代码。如果错误不在您的服务器上,请更正您的问题。
  • 仅供参考,客户端socket.send() 没有回调函数作为参数。
  • 那么有没有办法使用 WebSockets API 来实现我想要做的事情?我也编辑了我的问题,抱歉我今天感觉不对:(

标签: javascript websocket promise socket.io callback


【解决方案1】:

第一个问题。如果您在服务器端使用 socket.io,则必须使用 socket.io 客户端。您不能将 webSocket 客户端与 socket.io 服务器一起使用。他们不会连接。即使 socket.io 在下面使用 webSocket 传输也是如此。 socket.io 服务器需要 webSocket 之上的 socket.io 层。

第二个问题,要使用 socket.io 客户端发送数据,您可以在发送没有消息名称的原始数据时使用socket.send(),或者在发送消息名称时使用socket.emit()

在你的情况下,我建议你在客户端上使用它:

 socket.emit('checkLogin', {username, password}, function(result => {
     console.log(result);
 });

然后,像这样修改你的服务器代码:

socket.on('checkLogin', function(data, callback){
  let username = data.username;
  let password = data.password;
  console.log(username, password)
  webUser.findOne({username:username}, function(err, docs) {
    console.log(docs)
    if(docs){
      if(docs.password == password){
        callback(docs._id)
      }else{
        callback(false)
      }
    }
    if(!docs){
      callback(false)
    }
  });
})

【讨论】:

  • 我可以做像socket.send('42' + JSON.stringify(['checkLogin' , username, password]));这样的常规事情,而且它工作正常只是让回调工作一开始我无法让他们连接但使用这个const socket = new WebSocket('ws://157.230.66.208:4343/socket.io/?EIO=3&transport=websocket','chat-protocol');就像魅力
  • @NicholasHendricks - 如果你只打算使用 webSocket 功能,那么使用 webSocket 服务器,而不是 socket.io 服务器。使用 socket.io 的全部意义在于使用它在普通 webSocket 之外添加的功能。
  • 好的,我只是想知道我使用 WebSocket API 的全部原因是否可能是 Tabris.js 使用它并且不能与 socket.io-client 一起使用,遗憾的是感谢您的所有帮助
  • @NicholasHendricks - 如果您想使用 webSocket 进行编程,请将您的服务器更改为 webSocket 服务器,这将与 webSocket 客户端匹配。您将受限于标准 webSocket 协议支持的功能。
  • socket.io 已经用于 Web 客户端,我想保持这种方式,这就是为什么我试图为使用纯 WebSockets 和 socket.io 服务器制定解决方案的原因,因为 Tabris 不支持socket.io 客户端,现在我不能使用回调或类似的东西,除非我找到一种以某种方式实现回调的方法,否则我绝对不会使用纯 WebSockets。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多