我正在try 获取我的大学的html login page.当使用内置的fetch in node时,我得到了预期的html响应.然而,当使用Deno和Bun时,响应为空.Deno抛出EOF错误.BUN不打印任何内容.Python、Golang和wget都设法获得了html和 node .我的猜测是,服务器正在过早关闭连接,不确定是否有解决此问题的方法.

const r = await fetch(url, {redirect: "follow"});
console.log(await r.text())

我try 了上面的代码,它在 node 版本18中运行,但在Deno或Bun中不起作用,这两个版本都是最新的版本.

推荐答案

因为您提到这个问题出现在多个环境中(Deno、Bun、Inslenia等),所以响应似乎可能无效,但一些解析器会更优雅地处理它(例如Chrome、Node等).注意:如果没有看到您的确切回答,我无法验证这一点--而且您在问题中没有包括二进制响应数据.

在任何情况下,您都可以创建一个抽象,以便在解析过程中优雅地处理意外的文件结尾场景--您可以在异常处理代码中判断收集的数据是否满足您的条件,如果一切正常,则在该点进行恢复.下面是我在Deno和Node中测试的一个示例:

main.mjs:

async function parseHtmlBody(response) {
  const decoder = new TextDecoder();
  let html = "";

  try {
    for await (const u8Arr of response.body) {
      const str = decoder.decode(u8Arr, { stream: true });
      html += str;
    }
    return html;
  } catch (cause) {
    if (
      // The exception is an error:
      cause instanceof Error
      // And it includes the expected message text:
      && cause.message.toLowerCase().includes("unexpected end of file")
      // And it looks like the end of the document was received:
      && html.trimEnd().endsWith("</html>")
    ) return html;
    // Else, rethrow:
    throw cause;
  }
}

async function main() {
  // The URL in your question details:
  const url = "https://www.uvic.ca/cas/login";
  const response = await fetch(url, { redirect: "follow" });
  const html = await parseHtmlBody(response);
  // Print the beginning and end of the HTML document and its length:
  console.log(html.slice(0, 100));
  console.log("…");
  console.log(html.slice(-100));
  console.log("Total length:", html.length);
}

main();

在终端中:

% node --version
v18.16.1

% node main.mjs
<!DOCTYPE html><html lang="en">

<head>
    <meta charset="UTF-8" /><meta name="viewport" content="w
…
t src="https://kit.fontawesome.com/32795de2d2.js" crossorigin="anonymous"></script>
</body>
</html>

Total length: 7236

% deno --version
deno 1.35.0 (release, aarch64-apple-darwin)
v8 11.6.189.7
typescript 5.1.6

% deno run --allow-net main.mjs
<!DOCTYPE html><html lang="en">

<head>
    <meta charset="UTF-8" /><meta name="viewport" content="w
…
t src="https://kit.fontawesome.com/32795de2d2.js" crossorigin="anonymous"></script>
</body>
</html>

Total length: 7236

这两个输出看起来是一样的.您可以修改上面的代码以满足您的需要.

Node.js相关问答推荐

CloudTasksClient在Firebase Function % s onDocumentCreated中实例化时导致错误

如何在ejs模板中使用循环显示多个结果?

模块';"; node :流程&没有导出的成员';dlopen';

填充函数在Node.js和MongoDB中不起作用

如何在Mongoose for MongoDB中编写此查询

TS 后端开发:prismagenerate找不到已安装的@tsed/prisma包

无法将示例 Node.js 应用程序部署到 AWS Elastic Beanstalk

dayjs的isSameOrAfter方法未按预期工作

如何在带有 JS 的 Nodejs 中使用没有 Async 方法的 Await

如何使用 $PATH 变量在系统中全局自动安装 bash 脚本?或者重写脚本到node

try 在 NodeJS 项目中实现 SimplePay (OTP) 支付网关,但我无法获得与技术文档中相同的签名

如何从名字,中间名,姓氏中获取全名并在结果中搜索匹配?

如何在没有云功能的情况下使用 Google PubSub

使用服务帐户将 Firebase 应用程序部署到 Heroku(使用 dotenv 的环境变量)

使用 Node.JS,如何按时间顺序获取文件列表?

Node.js 服务器中没有缓存

使用 pg-promise 进行多行插入

Node.js `--nolazy` 标志是什么意思?

NPM:为什么要安装这个包?

从 node.js 连接到 mongodb 时出现 ECONNREFUSED 错误