我正在本地开发 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页面并返回标签的文本内容,它就不起作用了。
编辑:我已尝试按照服务器端事件文档的指示使用数据和事件字段,但没有解决问题。
正如@Bergi提到的,真正的问题是
CPU time limit reached
,之后隔离被破坏,这会触发您所看到的Hyper
(服务器)错误,因为服务器已关闭。
您可以在此处查看 Deno Deploy 限制 https://deno.com/deploy/docs/pricing-and-limits
在首次公开测试期间,适用以下硬性限制。 如果 超出任何运行时间限制,所有相关请求都将被 立即终止,并且警告将记录到 部署的日志。
您可以实现限制/分页机制来避免超时,因为您提到在获取 10 位艺术家时不会出现错误。
让您的服务器每次请求仅返回 1-10 位艺术家。