Deno 中的“块大小行期间出现意外的 EOF”错误是什么?

问题描述 投票:0回答:1

我正在本地开发 Supabase 的 Edge Function。它在 Deno 上运行。当我执行下面的代码时,出现以下错误:

CPU time limit reached. isolate: 16597602940236451129
CPU time used: 560ms
hyper::Error(User(Body), hyper::Error(Body, Custom { kind: UnexpectedEof, error: "unexpected EOF during chunk size line" }))

这是代码:

import { serve } from "https://deno.land/[email protected]/http/server.ts";
import { corsHeaders } from "../_shared/cors.ts";

function fetchArtistPage(artistName: string): Promise<string> {
  return new Promise((resolve, reject) => {
    setTimeout(async () => {
      try {
        const response = await fetch("https://www.last.fm/music/" + artistName.replace(" ", "+"));
        const page = await response.text();
        resolve(page);
      } catch (error) {
        reject(error);
      }
    }, 1000);
  });
}

serve(async (req) => {
  if (req.method === "OPTIONS") return new Response("ok", { headers: corsHeaders });

  const textEncoder = new TextEncoder();
  const artistsNames = await req.json();
  const body = new ReadableStream({
    async start(controller) {
      for (const artistName of artistsNames) {
        controller.enqueue(textEncoder.encode("START_OF_JSON "));
        const artistsData = {
          name: artistName,
          page: await fetchArtistPage(artistName),
        };
        controller.enqueue(textEncoder.encode(JSON.stringify(artistsData)));
        controller.enqueue(textEncoder.encode("END_OF_JSON "));
      }
      controller.close();
    },
  });
  return new Response(body, {
    headers: {
      ...corsHeaders,
      "Content-Type": "text/event-stream",
    },
  });
});

背景

artistsNames 变量将保存一个最多包含 50 个字符串的数组,其中每个字符串代表一个艺术家姓名。我将获取艺术家的last.fm页面并将其发送回artistsData对象内的响应中。

当我运行此代码时,错误出现在第 35-40 位艺术家附近。如果我只使用 10 位艺术家,则不会出现该错误。我只是尝试了很多事情,但没有任何效果。如果我只返回文本而不返回页面,它就可以工作。但是如果我解析html页面并返回标签的文本内容,它就不起作用了。

编辑:我已尝试按照服务器端事件文档的指示使用数据和事件字段,但没有解决问题。

javascript web-scraping server-sent-events supabase deno
1个回答
0
投票

正如@Bergi提到的,真正的问题是

CPU time limit reached
,之后隔离被破坏,这会触发您所看到的
Hyper
(服务器)错误,因为服务器已关闭。

您可以在此处查看 Deno Deploy 限制 https://deno.com/deploy/docs/pricing-and-limits

在首次公开测试期间,适用以下硬性限制。 如果 超出任何运行时间限制,所有相关请求都将被 立即终止,并且警告将记录到 部署的日志。


您可以实现限制/分页机制来避免超时,因为您提到在获取 10 位艺术家时不会出现错误。

让您的服务器每次请求仅返回 1-10 位艺术家。

© www.soinside.com 2019 - 2024. All rights reserved.