发布于 2026-01-06 7 阅读
0

使用 Node.js 从 Web 获取 JSON 的三种方法:JSONView,一个非常方便的 Chrome 和 Firefox Web 扩展程序,可在浏览器中美化 JSON 内容;使用 'node-fetch' 包复制 fetch() 函数;使用 Node.js 提供的 http/https 模块;使用 'request' 包简化语法。结论

使用 Node.js 从 Web 检索 JSON 的三种方法

JSONView是一款非常实用的 Chrome 和 Firefox 浏览器扩展程序,可以美化 JSON 数据。

使用'node-fetch'复制 fetch() 函数

使用Node.js提供的http / https模块

使用“request”简化语法

结论

封面图来源:富坚义博漫画《全职猎人》,由本人制作成表情包。<3

最近我遇到一个技术挑战,需要用 Node.js 构建一个小型应用程序,该应用程序首先需要从网络获取一些 JSON 数据。由于我对 Node.js 还比较陌生,我没有意识到 Node.js本身并不包含fetch() API,而我之前在前端 JavaScript 中一直习惯使用它。

(我当时没意识到的是,fetch() 实际上是Window接口中的一个方法——而且由于没有前端,所以没有窗口!在技术面试一开始就意识到这一点,真是尴尬……)

完成挑战后,我利用上周末重构了代码,并尝试了几种使用 Node.js 从网络获取 JSON 数据的不同方法。剧透一下: Node.js 中有http / https模块,还有一些很棒的包可以模拟 fetch() 函数,或者进一步简化请求语法!

但在我们深入探讨之前,我想介绍一个我在技术挑战中愚蠢地没有使用的工具: JSONView,这是一个非常方便的 Chrome 和 Firefox 网络扩展程序,可以在浏览器中美化打印 JSON。

JSONView是一款非常实用的 Chrome 和 Firefox 浏览器扩展程序,可以美化 JSON 数据。

我在编程挑战中遇到的一个问题是(由于我自己的错误),这个扩展程序在我的电脑上无法运行。请对比以下内容:

来自 Reddit 的原始 JSON
来自https://www.reddit.com/r/popular.json的未格式化 JSON

相对

使用 JSONView 从 Reddit 格式化 JSON
来自https://www.reddit.com/r/popular.json的相同 JSON ,使用 JSONView 进行美化打印。

此外,将鼠标悬停在特定字段上即可显示访问该字段的路径:

JSONView 中高亮显示的选定 JSON 属性路径
光标悬停在“向上”字段上,路径显示在左下角

有了它,解析和访问所需数据将变得更加快捷方便。

使用'node-fetch'复制 fetch() 函数

node-fetch 包的功能正如你所预期的那样:它为 Node.js 提供了 fetch() 语法。要安装它,请运行 `node-fetch` npm install node-fetch,并按如下方式配置你的代码:



const fetch = require('node-fetch');

let url = "https://www.reddit.com/r/popular.json";

let settings = { method: "Get" };

fetch(url, settings)
    .then(res => res.json())
    .then((json) => {
        // do something with JSON
    });


Enter fullscreen mode Exit fullscreen mode

首先,我们通过 `import` 导入了包require(),并创建了一个settings变量来定义我们的 HTTP 方法为 GET 请求。之后,我们fetch(url, settings)像在前端一样使用它。和往常一样,我们可以将响应解析res为 JSON,然后对其进行任何必要的处理。

注:根据一些非常初步的基准测试,node-fetch 似乎本文介绍的三种方案中最快的。以下是每种方案的测试时间(但是,这包括运行挑战中的其余代码,而不仅仅是 fetch/https/请求本身):



fetch: 0.689 seconds
https: 2.827 seconds
request: 3.65 seconds


Enter fullscreen mode Exit fullscreen mode

我非常希望有人能做更多测试,验证或推翻这个结论!如果你愿意的话,欢迎在下方留言。 ;)

使用Node.js提供的http / https模块

Node.js 自带 http/https 模块,在本例中,https 模块提供了一个内置的 GET 请求方法。以下是我们即将查看的代码:



const https = require('https');

let url = "https://www.reddit.com/r/popular.json";

https.get(url,(res) => {
    let body = "";

    res.on("data", (chunk) => {
        body += chunk;
    });

    res.on("end", () => {
        try {
            let json = JSON.parse(body);
            // do something with JSON
        } catch (error) {
            console.error(error.message);
        };
    });

}).on("error", (error) => {
    console.error(error.message);
});


Enter fullscreen mode Exit fullscreen mode

这里还有一些细节!首先,我们使用 `import https` 导入 https 模块require()。然后,我们可以调用`get()` 函数https.get(url, (res) => {} )来发起一个 GET 请求。接下来,在回调函数的主体中,我们首先创建一个空字符串body,然后将响应文本(同样称为 `response` res)添加到其中。

接下来,我们给出一些.on语法示例,它将监听几个不同的事件——即"data",,"end""error"

当响应遇到问题时"data",我们将每个数据块作为文本添加到响应体变量中。一旦到达"end"响应的末尾,我们就使用try / catch语法尝试将响应体中的文本解析为 JSON,如果解析失败则返回错误。最后,我们链式调用另一个.on方法来捕获"error"初始https.get()请求。

我发现这种语法相当笨拙冗长,尽管我确实喜欢它所要求的显式错误处理https.get()。然而,这个模块比 node-fetch 包慢——参见上面的基准测试结果。

使用“request”简化语法

我使用的第三种策略是 request 包,它旨在简化 Node.js http 请求(通常很冗长)的语法。由于这是一个外部包,请先使用以下命令安装它npm install request

以下是我们将要分析的代码:



const request = require('request');

let url = "https://www.reddit.com/r/popular.json";

let options = {json: true};



request(url, options, (error, res, body) => {
    if (error) {
        return  console.log(error)
    };

    if (!error && res.statusCode == 200) {
        // do something with JSON, using the 'body' variable
    };
});


Enter fullscreen mode Exit fullscreen mode

哇,这代码真易读!我们来详细分析一下。和其他示例一样,我们导入了请求包require(),并设置了 URL 变量。请求包还有一个很棒的options功能,可以指定很多东西——但在这里,{ json: true }我们通过设置 `json_parse_json` 告诉请求在没有错误(并且返回 200 状态码)的情况下自动将响应体解析为 JSON。所以,要访问我们想要的 JSON,只需使用 `json_parse_json`body变量即可!

然而,这种可读性是以牺牲速度为代价的。根据上面的基准测试结果,这是最慢的选项,很可能是因为底层处理的操作太多。不过,它的可读性一流,而且配置其他 HTTP 请求也和这个 GET 请求示例一样简单!

结论

这次的技术挑战让我有机会深入了解 Node.js 的 HTTP 请求!现在,你应该已经掌握了各种工具,可以应对不同的情况了。

正如我上面所说,我非常希望有人能进行一些测试/基准测试,验证或推翻我得到的速度测试结果!由于测试对我来说还比较陌生,我很想了解其他人是如何对这些方法进行基准测试的。感谢阅读,欢迎在下方留言!

文章来源:https://dev.to/isalevine/ Three-ways-to-retrieve-json-from-the-web-using-node-js-3c88