socket.emit 没有在 sveltekit 中执行内部函数

socket.emit not executing inside function in sveltekit

我在使用 SvelteKit 和 SocketIO 时遇到问题。我正在使用默认的 SocketIO 网关连接到 NestJS 后端并且连接工作正常,但是在函数内部执行 socket.emit 无法完全触发。不确定这是否与 SocketIO 或 SvelteKit 相关,但在函数外部执行发射是有效的。这是我的代码片段。

<script>
    import io from 'socket.io-client';
    let socket = io('http://localhost:5000');

    socket.on("connect", () => {
        console.log(socket.id);
    });

    socket.on("messages", (arg) => {
        console.log(arg);
    });

    socket.emit("messages", "executes at load", (err) => {
        console.log(err);
    });

    function onSendMessage() {
        console.log('executing function');
        socket.emit("messages", "test", (err) => {
            console.log(err);
        });
    }
</script>

<button on:click={onSendMessage}>
    Send Message
</button>

在这种情况下,''executes at load'' 被打印到控制台,因为它被发出并且服务器发回 socket.on 捕获的响应。它还通过 socket.on("connect") 打印连接的 ID。但如果我按下按钮,它永远不会打印''test''。按下按钮时控制台会记录“'executing function'”。还在 Postman 上测试了所有功能并且服务器正常工作。在没有按钮 onclick 的情况下直接在脚本标签中手动执行该函数会导致发出不执行的相同行为。有人有想法吗?

折腾了很久才发现问题所在。我认为这与它试图在客户端而不是 SvelteKit 的 SSR 端建立 XHR 轮询连接这一事实有关,而且 XHR 轮询似乎不支持 CORS 但 websockets 支持。

我所要做的就是在前端和后端都将传输指定为“'websocket'”,它工作得很好!