javascript - Socket.io 和 Express 不发送数据

标签 javascript node.js express websocket socket.io

我正在尝试使用 socket.io 连接到此 websocket api:

https://www.cryptocompare.com/api/#-api-web-socket-

(wss://streamer.cryptocompare.com)

我想我不太了解 socket.io。

我创建了一个空白的 html 文档:

    <!doctype html>
    <html lang="en">
        <head>
            <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.1.1/socket.io.slim.js"></script>
        </head>

        <body>

            <div id="data-show">
            </div>

            <button id="connect-sock">Connect</button>
            <button id="disconnect-sock">DISConnect</button>

        </body>
        <script src="index.js"></script>


    </html>

index.js:

var socket = io('wss://streamer.cryptocompare.com')
console.log('connected')
var btn = document.getElementById('connect-sock')
var btn2 = document.getElementById('disconnect-sock')
var show = document.getElementById('data-show')
     //I also tried adding an event listener to a button so when i clicked it, it would do this:
socket.emit('SubAdd', { subs: ['0~Poloniex~BTC~USD'] } )
    //Same result of nothing.
socket.on('SubAdd', function(data){
     console.log(data)
})

服务器.js:

var express = require('express')
var socket = require('socket.io')
var app = express()

var server = app.listen(4000, function(){
    console.log("well met")
})



app.use(express.static('public'))

var io = socket(server)

io.on('connection', function(socket){
    console.log('well met from socket connection', socket.id)
})

server.js 位于名为“socket-test”的文件中。 index.html 和index.js 位于'socket-test/public/'

由于某种原因,在 server.js 中,socket.id 将不会登录到控制台。就好像这个函数被跳过了。但是当我将index.js中的地址更改为http://localhost:4000时,我在控制台中得到了 socket.id...不知道那里发生了什么。

编辑:我在使用 wss://streamer.cryptocompare.com/时很少获得套接字 ID,有时会,但大多数时候不会。当我切换到本地主机,运行服务器,停止服务器,然后切换回流媒体时,它通常可以工作,但如果我重新加载,我就不再获得socket.id了。

我认为我要求它在这里做的就是将 subs 发送到 wss://streamer.cryptocompare,然后发送 subs 后返回的 console.log(data) 。

我在这里遗漏了什么吗?

如果我明显遗漏了一些东西,请提前抱歉。我现在才知道 socket.io 大约 3 天,直到今天我才在 YouTube 上观看了基本教程。

最佳答案

您不需要 Express 代码,因为在这种情况下,您想要与之通信的服务器位于 cryptocompare 服务器上,而不是本地服务器。当您在 HTML 文件中初始化 io 对象时,这会在您的代码中捕获。

当然,如果您更熟悉 Node,您仍然可以使用 Node 与 cryptocompare websockets API 进行对话。但这样你就不需要浏览器内的 JavaScript 了。无论哪种方式,您需要的是在任何运行时创建某种能够使用 websockets 并可以与 cryptocompare websockets API 进行交互的客户端。

关于被跳过的代码——你是对的!这是。 socket.io是一个事件驱动的 WebSockets 框架。这意味着客户端注册他们对某些类型的事件/消息的兴趣,并且当触发这些事件/消息时,将调用称为回调的特殊函数。

如果有帮助的话,您可以将这些事件想象成聊天室中的 channel - 如果您不在正确的房间中,您将看不到该房间的消息。因此,您需要知道应该监听哪些消息,注册您对这些消息的兴趣,并为每条消息注册回调函数。

值得庆幸的是,cryptocompare 提供了客户端代码示例,可以帮助您了解应该监听的消息类型。 请参阅here

关于javascript - Socket.io 和 Express 不发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51040783/

相关文章:

javascript - 随着时间的推移改变链接的颜色(这样它就不会在刷新时开始新的循环)

mysql - node-mysql - 返回列包含字符串的行

node.js - 如何在 Socket.io 中与 Heroku 服务器建立套接字连接?

mysql - Nodejs 中的嵌套 Cron 作业

node.js - 如何在node js中使用express重定向后app.get

javascript - 将 jquery-script 与 waypoints JS 连接

javascript - 使用组合 reducer 时无法将状态映射到 Prop

javascript - scrollIntoView 整个页面向下移动

javascript - Express中的 `onconnect`事件在哪里?

node.js - 异步/等待不等待