我正在開發 NestJS 應用程式,它向 Binance Websocket API 詢問一些資料。我在 console.log 中獲得了所有資料,但在 Postman 或瀏覽器視窗中,有一個請求未決。我不明白出了什么問題。如何在 Postman 或瀏覽器視窗中獲取資料?請幫忙。
更新
我開發了一個新的 WebSocket 服務器,它將資料從 Binance 的 WS 發送到 UI。而在 UI 方面,我只得到了第一項:| 怎么了?
Coin.gateway.ts
import { MessageBody, SubscribeMessage, WebSocketGateway, WebSocketServer } from '@nestjs/websockets';
import { Server } from 'socket.io';
import { from, of, take, map, Observable } from 'rxjs';
import { Coin } from './classes/coin';
import * as coinlist from './list/coins.json'
@WebSocketGateway(811, {transports: ['websocket', 'polling'], cors: true})
export class CoinGateway {
@WebSocketServer()
server: Server;
@SubscribeMessage('events')
handleMessage(@MessageBody() data: any) {
console.log('data',data)
const coins = new Coin(coinlist, 'usdt', 'miniTicker')
return coins.getCryptoData().pipe(map((c) => {
return c
}))
}
}
Coin.ts
import { GetCryptocurrencies } from "./abstract/get-cryptocurrencies";
import { WebSocket } from "ws";
import { Logger } from "@nestjs/common";
import { Observable } from "rxjs";
export class Coin extends GetCryptocurrencies {
private readonly logger = new Logger(Coin.name)
private baseUrl: string
private url: string
constructor(coin: { name: string, symbol: string }[], pair: string, method: string) {
super(coin, pair, method)
this.baseUrl = 'wss://stream.binance.com:9443/stream?streams='
this.url = coin.map((c) => {
return `${c.symbol.toLowerCase()}${pair}@${method}`
}).join('/')
}
getCryptoData(): any {
const stream$ = new Observable((observer) => {
const ws = new WebSocket(`${this.baseUrl}${this.url}`)
ws.on('open', () => {
this.logger.log('Connection established')
})
ws.onmessage = (msg: any) => {
const message = JSON.parse(msg.data)
observer.next(message)
}
ws.on('close', () => {
this.logger.log('Connection closed')
})
})
return stream$
}
}
客戶端 UI useEffect 鉤子
useEffect(() => {
const socket = io('ws://localhost:811', {transports: ['websocket']})
socket.on('connect', () => {
console.log('Connection established from client')
socket.emit('events', '', (res: any) => {
console.log(res)
})
const engine = socket.io.engine;
console.log(engine.transport.name); // in most cases, prints "polling"
engine.once("upgrade", () => {
// called when the transport is upgraded (i.e. from HTTP long-polling to WebSocket)
console.log(engine.transport.name); // in most cases, prints "websocket"
});
engine.on("packetCreate", ({ type, data }) => {
// called for each packet sent
console.log('Stype', type)
console.log('Sdata', data)
});
})
}, [])
uj5u.com熱心網友回復:
發生這種情況是因為您保持 Observable(以及隱式的 WebSocket 底層)處于活動狀態,這意味著 HTTP GET 呼叫永遠不會完成。
您可以通過確保 Observable 在第一個資料來自 WS 通道之后完成來解決它。所以take(1)在管道內添加,像這樣:
import { take } from 'rxjs/operators';
......................................
@Injectable()
export class GetDataService {
getCoins(): Observable<any[]> {
const coins = new Coin(coinlist, 'usdt', 'miniTicker')
return coins.getCryptoData().pipe(
take(1), // <---- I've added this
map((c) => {
console.log(c)
return c
}))
}
}
它應該可以解決您的問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/362024.html
標籤:javascript 节点.js 网络套接字 可观察的 嵌套
上一篇:為什么子域將請求重定向回父域?
