获取和流式传输数据
Deno 将几个熟悉的 Web API 带到服务器端环境。如果您使用过浏览器,您可能会认出 fetch()
方法和 streams
API,它们用于发出网络请求和访问网络上的数据流。 Deno 实现了这些 API,允许您从 Web 获取和流式传输数据。
获取数据 跳转到标题
在构建 Web 应用程序时,开发人员通常需要从 Web 上的其他位置检索资源。我们可以使用 fetch
API 来做到这一点。我们将看看如何从 URL 获取不同形状的数据,以及如果请求失败如何处理错误。
创建一个名为 fetch.js
的新文件并添加以下代码
// Output: JSON Data
const jsonResponse = await fetch("https://api.github.com/users/denoland");
const jsonData = await jsonResponse.json();
console.log(jsonData, "\n");
// Output: HTML Data
const textResponse = await fetch("https://deno.land/");
const textData = await textResponse.text();
console.log(textData, "\n");
// Output: Error Message
try {
await fetch("https://does.not.exist/");
} catch (error) {
console.log(error);
}
您可以使用 deno run
命令运行此代码。因为它正在跨网络获取数据,所以您需要授予 --allow-net
权限
deno run --allow-net fetch.js
您应该在控制台中看到 JSON 数据、HTML 数据作为文本以及错误消息。
流式传输数据 跳转到标题
有时您可能想要通过网络发送或接收大文件。当您事先不知道文件的大小时,流式传输是处理数据的更有效方式。客户端可以从流中读取,直到它表示已完成。
Deno 提供了一种使用 Streams API
流式传输数据的方法。我们将看看如何将文件转换为可读或可写流,以及如何使用流发送和接收文件。
创建一个名为 stream.js
的新文件。
我们将使用 fetch
API 来检索文件。然后我们将使用 Deno.open
方法创建并打开一个可写文件,并使用 Streams API 中的 pipeTo
方法将字节流发送到创建的文件。
接下来,我们将使用 POST
请求上的 readable
属性将文件的字节流发送到服务器。
// Receiving a file
const fileResponse = await fetch("https://deno.land/logo.svg");
if (fileResponse.body) {
const file = await Deno.open("./logo.svg", { write: true, create: true });
await fileResponse.body.pipeTo(file.writable);
}
// Sending a file
const file = await Deno.open("./logo.svg", { read: true });
await fetch("https://example.com/", {
method: "POST",
body: file.readable,
});
您可以使用 deno run
命令运行此代码。因为它正在跨网络获取数据并写入文件,所以您需要授予 --allow-net
、--allow-write
和 --allow-read
权限
deno run --allow-read --allow-write --allow-net stream.js
您应该看到文件 logo.svg
在当前目录中创建并填充,并且如果您拥有 example.com,您将看到文件被发送到服务器。
🦕 现在您知道如何跨网络获取和流式传输数据,以及如何将数据流式传输到文件以及从文件流式传输数据!无论您是提供静态文件、处理上传、生成动态内容还是流式传输大型数据集,Deno 的文件处理和流式传输功能都是您开发人员工具箱中非常棒的工具!