无法使用Deno中的Oak WebSocket中间件将消息从服务器发送回客户端

t3irkdon  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(146)

使用下面的代码时,客户端永远不会收到echo2消息。第一个消息echo1--在await之前,由客户端接收。如果删除await,客户端将接收到这两条消息。
我知道await以某种方式中断了WebSocket。我错过了什么?
服务器代码:

import {
  Application,
  Router
} from "https://deno.land/x/oak@v12.1.0/mod.ts";

const app = new Application();
const router = new Router();

async function pause(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

router.get("/ws", (ctx) => {
  console.log("ws connected");
  if (!ctx.isUpgradable) {
    ctx.throw(501);
  }
  const ws = ctx.upgrade();

  ws.onopen = () => {
    ws.send(JSON.stringify({ intent: "init", id: "test" }));
  };

  ws.addEventListener("message", async (ev) => {
    const d = JSON.parse(ev.data);
    console.log("got message", d);
    switch (d.intent) {
      case "echo": {
        ws.send(JSON.stringify({ intent: "echo1", data: { empty: true } }));
        await pause(1000);
        ws.send(JSON.stringify({ intent: "echo2", data: { empty: true } }));
        break;
      }
    }
  });
});

字符串
编辑:我使用一个简单的WS客户端Chrome扩展来测试WebSocket,而不是编写显式代码。

vngu2lb8

vngu2lb81#

当我从deno 1.32.x升级到1.34.3时,这个问题自行解决。

相关问题