socket.io - 如何让 Socket.io 与 Svelte 一起工作?
问题描述
我正在尝试让 socket.io 与我最近开始试验的 Svelte 一起工作,它是按照https://svelte.dev/给出的说明安装的库存形式。
我不知道为什么我会遇到bundle.js:4497 GET http://localhost:5000/socket.io/?EIO=3&transport=polling&t=N72840H 404 (Not Found)
错误,无论我尝试在早期的“基本”Node.js 服务器上使用什么组合,其相关代码如下所示:
const express = require('express');
const app = express();
const server = http.createServer(app)
const io = require('socket.io')(server,{
transports: ['websockets', 'polling'],
upgrade:false,
cookie:false
});
const sockets = require('./models/socket')(io)
我已经在各个地方尝试了上述建议的多种组合,例如:
require('http').Server(app)
...为什么.Server()
而不是.createServer()
?从来没有人解释。我试过有无app
,有些教程/帖子有express
,server or app.listen
有些没有——不知道它是否是先决条件。很多例子有localhost
,很多没有。有时冒号后有数字,有时没有。
在前端(在.svelte
文件中)尝试使用import io from 'socket.io-client'
, 在 index.html 文件中使用 cdn 并在<script src="../socket.io/socket.io.js"></script>
头部使用(无点、1 个点、无斜线等)。最后一个是不同的,因为在尝试连接之前没有找到它io()
,这是产生持久性错误的地方。
io()
有时建议为,io.connect()
或io.connect('localhost')
, 或io.connect('localhost:3000 or 8080 or some other)
。天知道为什么。
它与Rollup.js
捆绑东西的工作方式有关吗?我环顾四周,但没有任何有用的线索。
如果我的帖子缺少详细信息或信息,请在评论中说明,我将对其进行编辑以提供所需的详细信息。谢谢!
解决方案
- 创建全球商店
export const socket = writable();
- 添加实用功能
import { socket } from "../../store";
import {API_URL} from "../../config"
export const getSocket = async () => {
const script = document.createElement("script");
script.src = "/socket-3-0-0.js";
document.head.appendChild(script);
script.onload = () => {
const client = io(API_URL)
socket.set(client)
}
}
- 在 _layout 中调用 getSocket
<script>
onMount(async () => {
getSocket();
}
</script>
- 导入存储和使用
<script>
import { socket } from "../store";
$socket?.on("blah", function() {});
</script>
更新:
你可以在 _layout.svelte 中这样做:
<script lang="ts"> function getIoClient(tokens) { if (typeof io !== 'undefined') { return io(API_URL, { transports: ["websocket", "polling", "flashsocket"], withCredentials: true, query: { ...tokens, }, }) } } async function initSocket() { if ($loggedIn) { const auth = await getAuth() socket.set( getIoClient({ id_token: auth?.id_token, refresh_token: auth?.refresh_token, access_token: auth?.access_token, expiry_date: auth?.expiry_date, }) ) } } async function socketLoaded() { await initSocket() } </script> <svelte:head> {#if $loggedIn} <script src="/socket-3-1-3.js" on:load={socketLoaded}></script> {/if} </svelte:head>
推荐阅读
- python - 在 Python 中直接从内存中保存多个对象以压缩
- oauth-2.0 - PKCE OAuth 2.0 中“code_verifier”的意义是什么?
- javascript - 在 window.print() 上更改页眉和页脚
- android - Ionic cordova-plugin-facebook4 应用程序启动时崩溃
- haproxy - 默认情况下启用时,如何禁用某些部分的统计信息?
- excel - 检测到更改时将范围复制到另一个工作表的下一行
- modal-dialog - 模态联系表 - Shopify
- abap - SAP - 呼叫报告 RCS11001
- mysql - 如何选择给出另一个约束的最新mysql组?
- xml - 用 Kotlin 替换无效的 XML 1.0 字符