首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cloudflare工人- SSE

Cloudflare工人- SSE
EN

Stack Overflow用户
提问于 2020-12-30 09:30:19
回答 1查看 921关注 0票数 1

是否有办法对cloudflare工作人员进行服务器端事件?我只找到了一种方法,但它会在返回回复后立即停止。

代码语言:javascript
复制
    const { readable, writable } = new TransformStream();
    const response = {
      headers: new Headers({
        'Content-Type': 'text/event-stream',
        'Cache-Control': 'no-cache',
        'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept',
        Connection: 'keep-alive',
      }),
      status: 101
    };

    setInterval(() => {
      const encoder = new TextEncoder();
      const writer = writable.getWriter();
      writer.write(encoder.encode(`data: hello\n\n`));
    }, 5000);

    return new Response(readable, response);
EN

回答 1

Stack Overflow用户

发布于 2020-12-30 16:33:27

示例代码有两个问题:

  • 您不应该设置状态代码101。状态代码101意味着“交换协议”,即服务器将开始讲HTTP以外的内容。例如,这与WebSockets一起使用。但是,您的示例代码没有使用不同的协议--它只是带有流响应体的常规HTTP。除WebSocket之外,Worker运行时不支持交换协议,因此它将拒绝向您的101个状态代码提供服务,而是会向客户端提供一个错误。您要在每个间隔调用getWriter()
  • ,但是只能有一个写入器,等等,在第一次调用之后,调用失败。相反,您应该在设置间隔之前调用一次getWriter(),然后重用该编写器.

在预览中运行代码时,这两个问题都会显示为JavaScript控制台中的错误(例如,在cloudflareworkers.com、Cloudflare仪表板上,或者使用wrangler previewwrangler dev)。我建议使用预览来调试代码,因为它可以告诉您客户端不可见的错误。

在预览中,以下代码对我有效-文本按预期每5秒添加到响应中:

代码语言:javascript
复制
addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  const { readable, writable } = new TransformStream();
  const encoder = new TextEncoder();
  const writer = writable.getWriter();
  setInterval(() => {
    writer.write(encoder.encode(`data: hello\n\n`));
  }, 5000);

  return new Response(readable);
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65504714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档