http2 - Deno 1.9 原生网络服务器 API 和方法?

标签 http2 server-sent-events deno

我正试图在 Deno 1.9 release notes 上找到更多信息, 关于原生的API HTTP/2服务器。我的目标是将服务器发送的事件 ( SSE ) 与 HTTP/2 服务器一起使用。 发行说明中提供了以下代码:

const body = new TextEncoder().encode("Hello World");
for await (const conn of Deno.listen({ port: 4500 })) {
  (async () => {
    for await (const { respondWith } of Deno.serveHttp(conn)) {
      respondWith(new Response(body));
    }
  })();
}

我希望能够处理请求、发送 header 等。因此,如果有人可以向我指出 API,那就太好了。

最佳答案

围绕 Deno.serveHttp 的 API 实际上非常基础,类似于 MDN 上记录的 ServiceWorker 获取事件 API。

当我写这个答案时,Deno 的原生 HTTP 服务器仍然被标记为“不稳定”。 API 从那时起就稳定了,所以现在可以在此处查看文档:https://doc.deno.land/deno/stable/~/Deno.RequestEvent

总结是给你一个 Request object并负责构建/响应 Response object .响应构造函数上的 MDN 页面在显示响应请求时的选项方面应该非常有用。

此示例显示了一个带有正文、状态代码和一个额外 header 的响应:

    await evt.respondWith(new Response(someHtml, {
      status: 200,
      headers: new Headers({ "Content-Type": "text/html" }),
    }));

关于 SSE:目前 Deno 中没有内置服务器发送事件功能,因此就 Deno API 而言,SSE 流看起来像任何其他流响应。

生成 SSE 事件的最简单方法是使用像 Oak 这样的 HTTP 库,它有 native support for emitting events到 HTTP 响应。

如果您想更多地自己动手做,第一步是编写一个异步生成器函数来生成 SSE 有效负载流,例如此实现可生成 op_http_write 操作的累积指标每秒:

// Function generating the SSE-formatted data stream
async function* generateEvents() {
  while (true) {
    await new Promise((r) => setTimeout(r, 1000));
    const opMetrics = Deno.metrics().ops['op_http_write'];
    const message = `data: ${JSON.stringify(opMetrics)}\n\n`;
    yield new TextEncoder().encode(message);
  }
}

然后您将能够通过调用您的生成器函数来响应请求(在通过路径或 Accepts header 确认它是 SSE 之后):

import { readableStreamFromIterable } from "https://deno.land/std@0.95.0/io/streams.ts";

    const stream = readableStreamFromIterable(generateEvents());
    await respondWith(new Response(stream, {
      headers: new Headers({ "Content-Type": "text/event-stream" }),
    })).catch(err => { /* the client probably went away */ });

我已经上传了一个示例程序到https://crux.land/61HZ4a (Deno 1.9) 或 https://crux.land/84V4F (Deno 1.17) 可以像这样调用:deno run --unstable --allow-net=0.0.0.0 https://crux.land/84V4F 并包含一个显示 SSE 的测试页面收到的事件。

关于http2 - Deno 1.9 原生网络服务器 API 和方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67109823/

相关文章:

jquery - Server Sent Events EventSource 不会在 firefox 中连续调用

node.js - 使用 OpenCV 的 deno 模板匹配没有给出结果

firebase - 在 Deno 中使用 firebase-admin 的可能方法

typescript - 使用 Deno API 时出现 TSC 编译错误 (TS2307)

html - 如何配置 HAProxy 以处理服务器发送的事件?

openssl - 在centos 7服务器上使用directadmin和letsencrypt安装HTTP版本2

google-app-engine - Google AppEngine - 检测客户端是否支持 HTTP/2

sails.js - 如何在sails.js 中启用http/2

Golang 服务器发送事件 - 服务器发送事件处理程序是否不断调用自身?

http2 - Web 开发人员如何在 http2 中设置资源的优先级?