JavaScript >> Javascript 文檔 >  >> Node.js

使用 Node.js 從 Web 檢索 JSON 的三種方法

封面圖片來源:Hunter x Hunter Yoshihiro Togashi 的漫畫,由你的模因化。 <3

在最近的一個技術挑戰中,我被要求構建一個小型 Node.js 應用程序,首先需要從 Web 檢索一些 JSON。由於我對 Node.js 還比較陌生,我沒有意識到 Node.js 本身並不包含 fetch() API ,我習慣於在前端 JavaScript 中使用它。

(我沒有意識到 fetch() 實際上是 Window 中的一個方法 界面——沒有前端,就沒有窗口!在技​​術面試開始時意識到的尷尬事情......)

完成挑戰後,我在上週末重構了代碼並嘗試了幾種不同的方法來使用 Node.js 從 Web 檢索 JSON。 劇透: Node.js 中有一個 http/https 模塊,還有一些很酷的包可以模仿 fetch(),或者進一步簡化請求語法!

但在我們開始之前,我想介紹一個我愚蠢地沒有的工具 在我的技術挑戰期間使用:JSONView,一個超級方便的 Chrome 和 Firefox 網絡擴展,可以在瀏覽器中漂亮地打印 JSON。

JSONView,一個超級方便的 Chrome 和 Firefox 網絡擴展,可以在瀏覽器中漂亮地打印 JSON

我在代碼挑戰中遇到的一個問題是(由於我自己的錯誤)不能在我自己的計算機上工作,其中包括這個擴展。比較以下:


來自 https://www.reddit.com/r/popular.json 的未格式化 JSON


來自 https://www.reddit.com/r/popular.json 的相同 JSON,帶有 JSONView 的漂亮打印

最重要的是,將光標懸停在特定字段上將顯示訪問它的路徑:


光標懸停在“ups”字段上,路徑顯示在左下角

有了這個方便,您可以更快、更輕鬆地解析和訪問您需要的數據。

使用“node-fetch”包複製 fetch()

node-fetch 包幾乎可以滿足您的期望:為您提供 Node.js 中的 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
    });

在這裡,我們首先通過 require() 導入包 ,並創建了一個 settings 變量將我們的 http 方法定義為 Get 請求。從那裡,我們使用 fetch(url, settings) 就像我們在前端一樣。像往常一樣,我們可以解析響應 res 作為 JSON,然後用它做任何我們需要做的事情。

注意: 從一些非常基本的基準測試中,它出現 node-fetch 是本文介紹的三個選項中最快的。以下是每個人計時的時間(但是,這確實包括運行挑戰中的其餘代碼,而不僅僅是 fetch/https/request 本身):

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

我希望其他人做更多的測試並驗證/反駁這一點!如果您是那個人,請隨時在下面發表評論。;)

使用 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);
});

這裡還有更多事情要做!首先,我們用 require() 導入 https 模塊 .然後我們可以調用 https.get(url, (res) => {} ) 發起 Get 請求。然後,在回調的主體中,我們首先創建一個空字符串 body 我們將添加我們的響應文本(再次稱為 res ) 至。

從那裡,我們有一些 .on 的例子 語法,它將監聽幾個不同的事件——即,"data" , "end" , 和 "error" .

當響應遇到 "data" ,我們將每個塊作為文本添加到我們的 body 變量中。一旦我們點擊 "end" 對於響應,我們使用 try / catch 語法嘗試將我們的正文文本解析為 JSON,如果不能,則返回錯誤。最後,我們鏈接另一個 .on 調用捕獲 "error" 對於我們最初的 https.get() 請求。

我發現這種語法非常笨拙和冗長,儘管我確實喜歡必需的顯式錯誤處理 通過 https.get() .但是,這個模塊比 node-fetch 包要慢——參見上面的基準測試結果。

使用“請求”包簡化語法

我使用的第三個策略是請求包,它旨在簡化 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
    };
});

哇,真的好讀啊!讓我們分解一下。與其他示例一樣,我們使用 require() 導入包 ,並設置我們的 url 變量。請求包也有一個漂亮的 options 功能,您可以在其中指定很多東西 - 但在這裡,在設置 { json: true } ,如果沒有錯誤,我們會告訴請求自動將響應的主體解析為 JSON(並且我們會返回 200 狀態碼)。因此,要訪問我們想要的 JSON,只需使用 body 變量!

然而,這種可讀性是以速度為代價的。根據上面的基準測試結果,這是最慢的選擇,很可能是因為幕後發生了太多事情。但是,可讀性是一流的,配置其他 http 請求就像這個 Get 請求示例一樣簡單!

結論

這個特殊的技術挑戰是深入了解 Node.js 的 http 請求的絕佳機會!現在,您應該感到擁有各種工具來應對不同的情況。

正如我上面所說,我很樂意讓另一個人做一些測試/基準測試並驗證或反駁我得到的速度測試結果!由於測試對我來說仍然相對較新,我非常想看看其他人如何對這些方法進行基準測試。感謝閱讀,歡迎在下方評論!


Tutorial JavaScript 教程
  1. 值得使用框架或模塊嗎?

  2. 將 scrollTop 值從 textarea 複製到 div

  3. 使用 Alpine.js 創建模態對話框

  4. Vue3 中的類型安全可模擬全局變量

  5. 使用索引數組創建一個混亂的 JavaScript 錯誤

  6. 擴展運算符的使用列表

  7. 將 Apache ECharts 與 React 和 TypeScript 一起使用:使用聚合轉換

  1. 如何向所有服務器上的頻道發送消息

  2. Angular 4 中的表單簡介:編寫自定義表單驗證器

  3. 學習苗條 1 |為什麼你也應該

  4. 使用串聯(動態)字符串作為 JavaScript 對象鍵?

  5. 100DaysOfCode, Rd 3, 100% 完成*

  6. 6.2 完善您的 Firebase webapp - 響應式/自適應設計 - React 卡片佈局示例。

  7. 簡化的 JS 對象、原型和類

  1. 構建遊戲 Yahtzee

  2. 業餘愛好者的冒險~第四部分

  3. 通過 CI 上的重複任務自動化 NPM 軟件包安全修復

  4. Redux 和測試庫入門