🥳Tham gia Cộng đồng Scrapelessnhận thử nghiệm miễn phí của bạn để truy cập Bộ công cụ Web Scraping mạnh mẽ của chúng tôi!
Quay lại blog

Cách thực hiện yêu cầu HTTP trong Node.js với Fetch API

Emily Chen
Emily Chen

Advanced Data Extraction Specialist

10-Sep-2025

Những điểm chính

  • Fetch API cung cấp một giao diện hiện đại, dựa trên promise để thực hiện các yêu cầu HTTP trong Node.js, phù hợp với các thực hành phát triển phía trình duyệt.
  • Node.js v18 trở lên bao gồm hỗ trợ Fetch API bản địa, loại bỏ nhu cầu sử dụng các thư viện bên ngoài như node-fetch cho các thao tác cơ bản.
  • Hiểu biết về các phương thức HTTP khác nhau (GET, POST, PUT, DELETE, PATCH) và các tính năng nâng cao như tiêu đề, thời gian chờ, và xử lý lỗi là rất quan trọng cho các tương tác API vững chắc.
  • Tận dụng Fetch API hiệu quả có thể giúp đơn giản hóa việc lấy dữ liệu, cải thiện khả năng đọc mã và tăng cường hiệu suất ứng dụng trong các môi trường Node.js.
  • Đối với nhu cầu thu thập dữ liệu web phức tạp và thu thập dữ liệu, các dịch vụ chuyên biệt như Scrapeless cung cấp các khả năng nâng cao hơn những gì Fetch API bản địa có thể cung cấp.

Giới thiệu

Thực hiện các yêu cầu HTTP là một nhiệm vụ cơ bản trong phát triển web hiện đại. Dù bạn đang lấy dữ liệu từ một API REST, gửi dữ liệu biểu mẫu, hay tương tác với các dịch vụ bên thứ ba, một cơ chế tin cậy cho việc giao tiếp mạng là điều cần thiết. Đối với các nhà phát triển Node.js, Fetch API đã nổi lên như một giải pháp mạnh mẽ và chuẩn hóa. Bài viết này cung cấp một hướng dẫn toàn diện về việc sử dụng Fetch API trong Node.js, chi tiết các phương thức yêu cầu khác nhau, cấu hình nâng cao và các phương pháp tốt nhất để đảm bảo các tương tác dữ liệu hiệu quả và vững chắc. Chúng ta sẽ khám phá mười giải pháp chi tiết, hoàn chỉnh với các ví dụ mã, để giúp bạn xây dựng các ứng dụng Node.js hiệu suất cao. Cuối cùng, bạn sẽ có một hiểu biết rõ ràng về cách tận dụng Fetch API cho các trường hợp sử dụng đa dạng, từ việc lấy dữ liệu đơn giản cho đến các yêu cầu xác thực phức tạp, cuối cùng làm đơn giản hóa quy trình phát triển của bạn.

1. Yêu cầu GET cơ bản

Loại yêu cầu HTTP phổ biến nhất là GET, được sử dụng để lấy dữ liệu từ một tài nguyên chỉ định. Fetch API trong Node.js đơn giản hóa quy trình này đáng kể. Nó trả về một Promise mà khi được giải quyết sẽ thành đối tượng Response, cần được xử lý để trích xuất dữ liệu thực tế. Phương pháp này lý tưởng cho việc lấy thông tin công khai hoặc dữ liệu chỉ đọc từ một điểm cuối API.

javascript Copy
async function fetchData() {
  try {
    const response = await fetch('https://jsonplaceholder.typicode.com/posts/1');
    if (!response.ok) {
      throw new Error(`Lỗi HTTP! trạng thái: ${response.status}`);
    }
    const data = await response.json();
    console.log('Dữ liệu đã lấy:', data);
  } catch (error) {
    console.error('Lỗi khi lấy dữ liệu:', error);
  }
}

fetchData();

Ví dụ này thể hiện một yêu cầu GET cơ bản để lấy một bài viết từ một API công cộng. Thuộc tính response.ok kiểm tra xem mã trạng thái HTTP có trong khoảng từ 200-299 hay không, cho thấy yêu cầu đã thành công. Đây là một bước quan trọng cho việc xử lý lỗi đúng cách khi sử dụng Fetch API trong Node.js.

2. Yêu cầu POST cơ bản

Các yêu cầu POST được sử dụng để gửi dữ liệu đến máy chủ, thường là để tạo một tài nguyên mới. Khi thực hiện một yêu cầu POST với Fetch API trong Node.js, bạn cần chỉ định method là 'POST' trong đối tượng tùy chọn và bao gồm dữ liệu trong thuộc tính body. Thông thường, dữ liệu được gửi dưới dạng JSON, yêu cầu tiêu đề Content-Type phải được đặt thành application/json.

javascript Copy
async function createPost() {
  try {
    const newPost = {
      title: 'foo',
      body: 'bar',
      userId: 1,
    };

    const response = await fetch('https://jsonplaceholder.typicode.com/posts', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(newPost),
    });

    if (!response.ok) {
      throw new Error(`Lỗi HTTP! trạng thái: ${response.status}`);
    }

    const data = await response.json();
    console.log('Bài viết mới đã được tạo:', data);
  } catch (error) {
    console.error('Lỗi khi tạo bài viết:', error);
  }
}

createPost();

Đoạn mã này minh họa cách tạo một bài viết mới bằng cách sử dụng một yêu cầu POST. Phương thức JSON.stringify() chuyển đổi đối tượng JavaScript thành một chuỗi JSON, sau đó được gửi dưới dạng thân yêu cầu. Đây là một thực hành tiêu chuẩn để gửi dữ liệu cấu trúc bằng Fetch API trong Node.js.

3. Xử lý tiêu đề HTTP

Tiêu đề HTTP cung cấp thông tin bổ sung về yêu cầu hoặc phản hồi. Bạn có thể tùy chỉnh tiêu đề yêu cầu bằng cách sử dụng thuộc tính headers trong đối tượng tùy chọn của Fetch API trong Node.js. Điều này đặc biệt hữu ích để gửi token xác thực, chỉ định loại nội dung, hoặc thiết lập các tác nhân người dùng tùy chỉnh. Quản lý tiêu đề một cách phù hợp là rất quan trọng cho việc giao tiếp API an toàn và hiệu quả.

javascript Copy
async function fetchWithHeaders() {
  try {
    const response = await fetch('https://jsonplaceholder.typicode.com/users/1', {
      headers: {
        'Authorization': 'Bearer your_token_here',
        'User-Agent': 'MyNodeApp/1.0',
        'Accept': 'application/json',
      },
    });

    if (!response.ok) {
      throw new Error(`Lỗi HTTP! trạng thái: ${response.status}`);
    }

    const data = await response.json();
javascript Copy
console.log('Dữ liệu người dùng với tiêu đề tùy chỉnh:', data);
  } catch (error) {
    console.error('Lỗi khi lấy dữ liệu với tiêu đề:', error);
  }
}

fetchWithHeaders();

Trong ví dụ này, chúng tôi đang thêm một tiêu đề Authorization để xác thực API, một User-Agent để xác định ứng dụng của chúng tôi, và một tiêu đề Accept để chỉ định định dạng phản hồi mong muốn. Điều này thể hiện tính linh hoạt của Node.js Fetch API trong việc xử lý những yêu cầu tiêu đề đa dạng.

4. Yêu cầu PUT để cập nhật tài nguyên

Các yêu cầu PUT được sử dụng để cập nhật một tài nguyên hiện có trên máy chủ. Khác với PATCH, PUT thường thay thế toàn bộ tài nguyên bằng dữ liệu mới được cung cấp. Khi sử dụng Node.js Fetch API cho các yêu cầu PUT, bạn sẽ chỉ định method là 'PUT' và bao gồm dữ liệu cập nhật trong body.

javascript Copy
async function updatePost() {
  try {
    const updatedPost = {
      id: 1,
      title: 'tiêu đề đã cập nhật',
      body: 'nội dung đã cập nhật',
      userId: 1,
    };

    const response = await fetch('https://jsonplaceholder.typicode.com/posts/1', {
      method: 'PUT',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(updatedPost),
    });

    if (!response.ok) {
      throw new Error(`Lỗi HTTP! trạng thái: ${response.status}`);
    }

    const data = await response.json();
    console.log('Bài viết đã được cập nhật:', data);
  } catch (error) {
    console.error('Lỗi khi cập nhật bài viết:', error);
  }
}

updatePost();

Mã này cho thấy cách cập nhật một bài viết bằng cách sử dụng yêu cầu PUT. Toàn bộ đối tượng updatedPost được gửi, thay thế tài nguyên hiện có tại URL đã chỉ định. Đây là một mẫu phổ biến để quản lý dữ liệu với Node.js Fetch API.

5. Yêu cầu DELETE để xóa tài nguyên

Các yêu cầu DELETE được sử dụng để xóa một tài nguyên được chỉ định từ máy chủ. Những yêu cầu này thường không yêu cầu một thân yêu cầu. Node.js Fetch API xử lý các yêu cầu DELETE bằng cách đơn giản đặt method thành 'DELETE'.

javascript Copy
async function deletePost() {
  try {
    const response = await fetch('https://jsonplaceholder.typicode.com/posts/1', {
      method: 'DELETE',
    });

    if (!response.ok) {
      throw new Error(`Lỗi HTTP! trạng thái: ${response.status}`);
    }

    console.log('Bài viết đã được xóa thành công.');
  } catch (error) {
    console.error('Lỗi khi xóa bài viết:', error);
  }
}

deletePost();

Ví dụ này minh họa một yêu cầu DELETE đơn giản. Sau khi xóa thành công, máy chủ thường trả về trạng thái 200 OK hoặc 204 Không có nội dung. Node.js Fetch API cung cấp một cách rõ ràng để thực hiện những thao tác như vậy.

6. Yêu cầu PATCH để cập nhật một phần

Các yêu cầu PATCH được sử dụng để áp dụng các sửa đổi một phần cho một tài nguyên. Khác với PUT, thay thế toàn bộ tài nguyên, PATCH chỉ gửi những thay đổi. Điều này có thể hiệu quả hơn cho những tài nguyên lớn mà chỉ cần cập nhật một vài trường. Node.js Fetch API hỗ trợ PATCH bằng cách thiết lập method tương ứng.

javascript Copy
async function patchPost() {
  try {
    const partialUpdate = {
      title: 'tiêu đề đã cập nhật một phần',
    };

    const response = await fetch('https://jsonplaceholder.typicode.com/posts/1', {
      method: 'PATCH',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(partialUpdate),
    });

    if (!response.ok) {
      throw new Error(`Lỗi HTTP! trạng thái: ${response.status}`);
    }

    const data = await response.json();
    console.log('Bài viết đã được cập nhật một phần:', data);
  } catch (error) {
    console.error('Lỗi khi cập nhật bài viết bằng PATCH:', error);
  }
}

patchPost();

Đoạn mã này cho thấy cách thực hiện một yêu cầu PATCH để chỉ cập nhật title của một bài viết. Phương pháp này rất hiệu quả cho những cập nhật gia tăng, khiến Node.js Fetch API linh hoạt cho nhiều tác vụ quản lý dữ liệu khác nhau.

7. Xử lý thời gian chờ và hủy yêu cầu

Các yêu cầu mạng có thể đôi khi bị treo hoặc mất quá nhiều thời gian, ảnh hưởng đến trải nghiệm người dùng. Node.js Fetch API có thể được kết hợp với AbortController để triển khai thời gian chờ yêu cầu và hủy bỏ. Đây là một tính năng quan trọng để xây dựng các ứng dụng bền bỉ có thể xử lý vấn đề mạng một cách nhẹ nhàng.

javascript Copy
async function fetchWithTimeout() {
  const controller = new AbortController();
  const timeoutId = setTimeout(() => controller.abort(), 5000); // thời gian chờ 5 giây

  try {
    const response = await fetch('https://jsonplaceholder.typicode.com/posts', {
      signal: controller.signal,
    });

    clearTimeout(timeoutId);

    if (!response.ok) {
      throw new Error(`Lỗi HTTP! trạng thái: ${response.status}`);
    }

    const data = await response.json();
    console.log('Dữ liệu đã được lấy trong thời gian chờ:', data.slice(0, 2)); // Ghi lại 2 mục đầu tiên
  } catch (error) {
    if (error.name === 'AbortError') {
      console.error('Lấy dữ liệu đã bị hủy do thời gian chờ.');
    } else {
      console.error('Lỗi khi lấy dữ liệu với thời gian chờ:', error);
    }
  }
}

fetchWithTimeout();

Ví dụ này minh họa cách thiết lập thời gian chờ 5 giây cho một yêu cầu fetch. Nếu yêu cầu không hoàn thành trong thời gian này, nó sẽ bị hủy, và một AbortError sẽ được bắt. Việc xử lý lỗi mạnh mẽ này là rất cần thiết cho các ứng dụng phụ thuộc vào Node.js Fetch API cho các giao tiếp bên ngoài.

8. Gửi Dữ liệu Form (multipart/form-data)

Khi xử lý việc tải lên tệp hoặc gửi biểu mẫu phức tạp, multipart/form-data là kiểu nội dung tiêu chuẩn. Node.js Fetch API có thể xử lý điều này bằng cách sử dụng API FormData. Điều này đặc biệt hữu ích cho các ứng dụng web cần tương tác với các biểu mẫu HTML truyền thống hoặc các điểm cuối tải lên tệp.

javascript Copy
async function uploadFile() {
  try {
    const formData = new FormData();
    // Trong một ứng dụng thực tế, 'file' sẽ là một đối tượng Blob hoặc File
    // Để minh họa, chúng ta sẽ giả lập một tệp bằng một chuỗi
    formData.append('username', 'JohnDoe');
    formData.append('profilePicture', 'fake_file_content', 'profile.txt');

    const response = await fetch('https://httpbin.org/post', {
      method: 'POST',
      body: formData,
    });

    if (!response.ok) {
      throw new Error(`Lỗi HTTP! trạng thái: ${response.status}`);
    }

    const data = await response.json();
    console.log('Phản hồi tải lên tệp:', data);
  } catch (error) {
    console.error('Lỗi tải lên tệp:', error);
  }
}

uploadFile();

Ví dụ này cho thấy cách xây dựng FormData và gửi nó với một yêu cầu POST. Node.js Fetch API tự động thiết lập tiêu đề Content-Type thành multipart/form-data khi một đối tượng FormData được cung cấp như là body. Điều này đơn giản hóa việc xử lý các gửi biểu mẫu phức tạp.

9. Truyền Phản hồi

Đối với các phản hồi lớn hoặc các nguồn dữ liệu theo thời gian thực, việc truyền phản hồi có thể hiệu quả hơn so với việc chờ cho toàn bộ phản hồi tải về. Node.js Fetch API cho phép bạn truy cập nội dung phản hồi dưới dạng ReadableStream, cho phép bạn xử lý dữ liệu theo từng phân đoạn. Điều này đặc biệt có lợi cho các ứng dụng quan trọng về hiệu suất hoặc khi xử lý các luồng dữ liệu liên tục.

javascript Copy
async function streamResponse() {
  try {
    const response = await fetch('https://jsonplaceholder.typicode.com/comments');

    if (!response.ok) {
      throw new Error(`Lỗi HTTP! trạng thái: ${response.status}`);
    }

    const reader = response.body.getReader();
    let receivedLength = 0; // số byte nhận được tại thời điểm này
    let chunks = []; // mảng các phân đoạn nhị phân đã nhận (bao gồm nội dung)

    while (true) {
      const { done, value } = await reader.read();

      if (done) {
        break;
      }

      chunks.push(value);
      receivedLength += value.length;
      console.log(`Nhận được ${receivedLength} byte`);
    }

    const received = new Blob(chunks); // (Blob là một loại đối tượng giống như tệp)
    const text = await received.text();
    console.log('Phản hồi đã được truyền hoàn tất. Tổng chiều dài:', receivedLength, 'byte. 200 ký tự đầu tiên:', text.substring(0, 200));

  } catch (error) {
    console.error('Lỗi khi truyền phản hồi:', error);
  }
}

streamResponse();

Ví dụ này minh họa cách đọc thân phản hồi dưới dạng luồng, xử lý nó theo từng phân đoạn. Cách tiếp cận này có thể giảm đáng kể mức sử dụng bộ nhớ và cải thiện khả năng phản hồi cho các ứng dụng xử lý các tập dữ liệu lớn thông qua Node.js Fetch API.

10. So sánh Fetch API vs. Axios

Mặc dù Node.js Fetch API hiện đã có sẵn mặc định, Axios vẫn là một lựa chọn phổ biến để gửi các yêu cầu HTTP. Hiểu sự khác biệt của chúng giúp bạn chọn công cụ phù hợp cho dự án của mình. Cả hai đều có ưu điểm riêng, và sự lựa chọn thường phụ thuộc vào yêu cầu của dự án và sở thích của nhà phát triển.

Tính năng Fetch API (Mặc định) Axios (Thư viện bên thứ ba)
Dựa trên Promise
Hỗ trợ Trình duyệt Mặc định trong các trình duyệt hiện đại Cần polyfills cho các trình duyệt cũ
Hỗ trợ Node.js Mặc định (v18+) Cần cài đặt (npm install axios)
Phân tích JSON Tự động Thủ công (response.json()) Tự động
Xử lý lỗi response.ok cho lỗi HTTP, catch cho lỗi mạng Từ chối promise trong trường hợp lỗi HTTP (4xx, 5xx)
Hủy yêu cầu AbortController CancelToken (đã bị bỏ) / AbortController
Interceptors Không có hỗ trợ mặc định Có (interceptors cho yêu cầu và phản hồi)
Tiến Trình Tải Lên Phát trực tiếp thủ công Tích hợp sẵn
Bảo vệ XSRF Không hỗ trợ gốc
Kích thước Gói Bằng không (gốc) Thêm vào kích thước gói

Axios cung cấp nhiều tính năng hơn ngay từ đầu, như phân tích JSON tự động và các bộ lọc, điều này có thể đơn giản hóa việc phát triển cho các ứng dụng phức tạp. Tuy nhiên, Node.js Fetch API gốc cung cấp một giải pháp nhẹ, tuân thủ tiêu chuẩn mà không có phụ thuộc bổ sung, khiến nó trở thành lựa chọn tuyệt vời cho các trường hợp sử dụng đơn giản hơn hoặc khi việc giảm kích thước gói là ưu tiên. Ví dụ, một báo cáo gần đây bởi Cloudflare chỉ ra rằng các yêu cầu HTTP tiếp tục là một phần quan trọng của lưu lượng web, với các tối ưu hóa trong các cuộc gọi API ảnh hưởng trực tiếp đến hiệu suất [1]. Điều này nhấn mạnh tầm quan trọng của việc chọn một phương pháp hiệu quả cho các yêu cầu HTTP.

Nghiên Cứu Tình Huống và Kịch Bản Ứng Dụng

Tính linh hoạt của Node.js Fetch API mở rộng đến nhiều ứng dụng thực tế. Dưới đây là một vài kịch bản mà nó cho thấy giá trị vô giá:

Kịch Bản 1: Xây Dựng Một Bộ Tập Hợp Dữ Liệu Bên Máy Chủ

Hãy tưởng tượng bạn đang xây dựng một dịch vụ backend mà tổng hợp dữ liệu từ nhiều API bên ngoài (ví dụ như thời tiết, tin tức, giá cổ phiếu) và trình bày một cái nhìn thống nhất cho frontend của bạn. Node.js Fetch API rất phù hợp cho mục đích này. Bạn có thể thực hiện các yêu cầu đồng thời đến những điểm cuối khác nhau, xử lý các phản hồi và kết hợp chúng trước khi gửi đến khách hàng. Cách tiếp cận này cực kỳ hiệu quả để tạo bảng điều khiển hoặc các ứng dụng giàu dữ liệu.

javascript Copy
async function aggregateData() {
  try {
    const [weatherRes, newsRes] = await Promise.all([
      fetch('https://api.weatherapi.com/v1/current.json?key=YOUR_API_KEY&q=London'),
      fetch('https://newsapi.org/v2/top-headlines?country=us&apiKey=YOUR_API_KEY')
    ]);

    const weatherData = await weatherRes.json();
    const newsData = await newsRes.json();

    console.log('Dữ liệu tổng hợp:', { weather: weatherData, news: newsData.articles.slice(0, 1) });
  } catch (error) {
    console.error('Lỗi khi tổng hợp dữ liệu:', error);
  }
}

// aggregateData(); // Bỏ chú thích để chạy, yêu cầu khóa API hợp lệ

Ví dụ này minh họa Promise.all với Node.js Fetch API để lấy dữ liệu đồng thời, làm tăng đáng kể tốc độ tổng hợp dữ liệu.

Kịch Bản 2: Triển Khai Một Trình Nghe Webhook

Webhook là những tin nhắn tự động được gửi từ các ứng dụng khi có điều gì đó xảy ra. Ứng dụng Node.js của bạn có thể cần hoạt động như một trình nghe webhook, nhận các yêu cầu POST từ các dịch vụ như GitHub, Stripe, hoặc một thiết bị IoT tùy chỉnh. Node.js Fetch API (hay đúng hơn, máy chủ HTTP bên dưới) rất quan trọng cho việc xử lý các yêu cầu đến, trong khi fetch có thể được sử dụng để phản hồi những webhook này hoặc chuyển tiếp dữ liệu đến các dịch vụ khác.

javascript Copy
// Đây là một ví dụ khái niệm cho một trình nghe webhook sử dụng Express.js
// Fetch API sẽ được sử dụng *trong* trình nghe này để thực hiện các yêu cầu ra ngoài.

// const express = require('express');
// const app = express();
// app.use(express.json());

// app.post('/webhook', async (req, res) => {
//   console.log('Nhận webhook:', req.body);
//   // Ví dụ: Chuyển tiếp dữ liệu đến một dịch vụ khác sử dụng Fetch API
//   try {
//     const response = await fetch('https://another-service.com/api/data', {
//       method: 'POST',
//       headers: { 'Content-Type': 'application/json' },
//       body: JSON.stringify(req.body),
//     });
//     if (!response.ok) {
//       throw new Error(`Chuyển tiếp không thành công: ${response.status}`);
//     }
//     console.log('Dữ liệu webhook đã được chuyển tiếp thành công.');
//     res.status(200).send('Đã nhận');
//   } catch (error) {
//     console.error('Lỗi khi chuyển tiếp webhook:', error);
//     res.status(500).send('Lỗi');
//   }
// });

// const PORT = process.env.PORT || 3000;
// app.listen(PORT, () => console.log(`Trình nghe webhook đang chạy trên cổng ${PORT}`));

Ví dụ khái niệm này minh họa cách mà Node.js Fetch API có thể được tích hợp vào một trình nghe webhook để xử lý và chuyển tiếp dữ liệu, thể hiện vai trò của nó trong việc giao tiếp giữa các máy chủ.

Kịch Bản 3: Cào Dữ Liệu Tự Động với Các Proxy

Đối với các tác vụ yêu cầu khai thác dữ liệu tự động từ các trang web, Node.js Fetch API có thể được kết hợp với các dịch vụ proxy để vượt qua giới hạn tần suất hoặc các hạn chế địa lý. Đây là một trường hợp sử dụng phổ biến cho nghiên cứu thị trường, theo dõi giá cả, hoặc tổng hợp nội dung. Trong khi fetch cung cấp chức năng yêu cầu cốt lõi, một giải pháp proxy vững chắc thường là cần thiết cho các hoạt động cào dữ liệu quy mô lớn. Báo cáo hàng năm của HTTP Archive liên tục cho thấy sự phức tạp ngày càng tăng của các trang web, khiến việc lấy dữ liệu hiệu quả trở nên quan trọng [2].

javascript Copy
async function scrapeWithProxy() {
const proxyUrl = 'http://your_proxy_ip:your_proxy_port'; // Thay thế bằng thông tin proxy của bạn
const targetUrl = 'https://example.com'; // Thay thế bằng trang web mục tiêu

try {
    // Lưu ý: Sử dụng proxy với Fetch API gốc trong Node.js có thể yêu cầu
    // cấu hình các tác nhân toàn cục hoặc sử dụng thư viện như 'https-proxy-agent'
    // Để đơn giản, ví dụ này giả định một kết nối trực tiếp hoặc một môi trường đã được cấu hình.
    const response = await fetch(targetUrl, {
        // agent: new HttpsProxyAgent(proxyUrl) // Nếu sử dụng https-proxy-agent
    });

    if (!response.ok) {
        throw new Error(`Lỗi HTTP! trạng thái: ${response.status}`);
    }

    const html = await response.text();
    console.log('HTML đã thu thập (500 ký tự đầu tiên):', html.substring(0, 500));
} catch (error) {
    console.error('Lỗi khi thu thập dữ liệu với proxy:', error);
}

// scrapeWithProxy(); // Bỏ chú thích để chạy, yêu cầu thiết lập proxy

Kịch bản này làm nổi bật tiềm năng của Fetch API trong Node.js trong việc thu thập dữ liệu trên web, đặc biệt khi được tăng cường với các cấu hình proxy nhằm nâng cao tính ẩn danh và khả năng truy cập.

Đề xuất Scrapeless

Trong khi Fetch API trong Node.js rất tốt cho các yêu cầu HTTP chung, các tác vụ thu thập dữ liệu phức tạp và thu thập dữ liệu thường yêu cầu các khả năng nâng cao hơn, chẳng hạn như xử lý CAPTCHA, quản lý proxy, kết xuất JavaScript và đối phó với các biện pháp chống bot. Đối với những nhu cầu chuyên biệt này, chúng tôi khuyến nghị bạn nên khám phá Scrapeless. Scrapeless là một dịch vụ mạnh mẽ được thiết kế để đơn giản hóa việc thu thập dữ liệu trên web bằng cách cung cấp hạ tầng vững chắc để xử lý những phức tạp này cho bạn. Nó cho phép các nhà phát triển tập trung vào logic thu thập dữ liệu thay vì các thách thức hạ tầng, biến nó thành một công cụ vô giá cho các dự án dữ liệu quy mô lớn. Dù bạn cần thu thập dữ liệu sản phẩm thương mại điện tử, theo dõi kết quả công cụ tìm kiếm, hay thu thập thông tin mạng xã hội, Scrapeless cung cấp các giải pháp được cá nhân hóa mà có thể tích hợp liền mạch với quy trình làm việc hiện tại của bạn. Ví dụ, API thu thập dữ liệuAPI thu thập dữ liệu toàn cầu của họ được xây dựng để xử lý nội dung động và cung cấp dữ liệu sạch, có cấu trúc. Đối với những nhu cầu cụ thể như dữ liệu Tìm kiếm Google hoặc dữ liệu thương mại điện tử, Scrapeless cung cấp các giải pháp tối ưu hóa vượt ngoài khả năng mà một triển khai cơ bản của Fetch API trong Node.js có thể đạt được. Nền tảng của họ cũng cung cấp các giải pháp cho thu thập dữ liệu mạng xã hộicông cụ phát triển để hỗ trợ thêm cho hành trình thu thập dữ liệu của bạn.

Kết luận

Fetch API trong Node.js cung cấp một cách hiện đại, hiệu quả và tiêu chuẩn để thực hiện các yêu cầu HTTP, biến nó thành một công cụ thiết yếu cho bất kỳ nhà phát triển Node.js nào. Từ các thao tác cơ bản GETPOST cho đến việc xử lý các kịch bản phức tạp như thời gian chờ, tải lên tệp và phản hồi luồng, Fetch API cung cấp một bộ tính năng toàn diện. Việc tích hợp nguyên bản của nó trong Node.js v18+ còn đơn giản hóa phát triển bằng cách loại bỏ các phụ thuộc bên ngoài. Trong khi nó xuất sắc ở nhiều lĩnh vực, việc hiểu rõ các hạn chế của nó và biết khi nào nên tận dụng các công cụ chuyên dụng như Scrapeless cho các tác vụ đòi hỏi hơn là chìa khóa để xây dựng các ứng dụng thực sự mạnh mẽ và có thể mở rộng. Hãy tận dụng sức mạnh của Fetch API trong Node.js để tăng cường khả năng tương tác dữ liệu của ứng dụng bạn.

Bạn có sẵn sàng để tối ưu hóa nỗ lực thu thập dữ liệu và thu thập thông tin trên web của mình? Đăng ký Scrapeless ngay hôm nay!

Câu hỏi thường gặp

Q1: Lợi thế chính của việc sử dụng Fetch API gốc trong Node.js so với các thư viện bên ngoài là gì?

Lợi thế chính là Fetch API trong Node.js được tích hợp trực tiếp vào môi trường thực thi Node.js (từ v18 trở đi), có nghĩa là bạn không cần phải cài đặt bất kỳ gói bên ngoài nào như node-fetch hay axios. Điều này giảm thiểu phụ thuộc vào dự án, đơn giản hóa thiết lập và có thể dẫn đến kích thước ứng dụng nhỏ hơn. Nó cũng cung cấp một API nhất quán để thực hiện các yêu cầu HTTP trên cả môi trường trình duyệt và máy chủ, điều này có lợi cho các nhà phát triển JavaScript toàn diện.

Q2: Fetch API xử lý lỗi như thế nào so với Axios?

Cách xử lý lỗi của Fetch API trong Node.js khác với Axios. Hứa hẹn fetch() của Fetch API chỉ từ chối khi có lỗi mạng (chẳng hạn như không có kết nối internet, lỗi phân giải DNS). Đối với lỗi HTTP (như 404 Không tìm thấy hoặc 500 Lỗi máy chủ nội bộ), hứa hẹn vẫn được giải quyết, nhưng thuộc tính response.ok sẽ là false. Bạn phải kiểm tra rõ ràng response.ok để xác định xem yêu cầu có thành công hay không. Ngược lại, Axios tự động từ chối hứa hẹn cho bất kỳ mã trạng thái HTTP nào nằm ngoài phạm vi 2xx, đơn giản hóa quá trình xử lý lỗi cho nhiều nhà phát triển.

Q3: Tôi có thể sử dụng Fetch API để tải lên tệp trong Node.js không?

Có, bạn có thể sử dụng Node.js Fetch API để tải lên tệp. Bạn thường làm điều này bằng cách tạo một đối tượng FormData và thêm tệp (hoặc nội dung tệp giả) của bạn vào đó. Khi bạn truyền đối tượng FormData như là body của yêu cầu fetch, API tự động thiết lập tiêu đề Content-Typemultipart/form-data, đây là tiêu chuẩn cho việc tải lên tệp. Điều này làm cho việc gửi dữ liệu nhị phân hoặc các biểu mẫu phức tạp trở nên dễ dàng.

Q4: Một số cạm bẫy phổ biến khi sử dụng Fetch API trong Node.js là gì?

Một số cạm bẫy phổ biến bao gồm quên kiểm tra response.ok cho các trạng thái lỗi HTTP, không xử lý lỗi mạng với khối .catch(), và các vấn đề với CORS (Chia sẻ Tài nguyên Giữa Các Nguồn Gốc) khi thực hiện các yêu cầu đến các miền khác nhau (mặc dù điều này phổ biến hơn trong môi trường trình duyệt, nó vẫn có thể xảy ra trong một số cấu hình Node.js cụ thể). Ngoài ra, việc quản lý cookie có thể phức tạp hơn với Fetch API so với một số thư viện bên thứ ba, vì hành vi của nó dựa trên tiêu chuẩn của trình duyệt.

Q5: Fetch API có phù hợp cho việc thu thập dữ liệu trên web trong Node.js không?

Có, Node.js Fetch API có thể được sử dụng cho các tác vụ thu thập dữ liệu trên web cơ bản, đặc biệt là để lấy nội dung HTML tĩnh. Tuy nhiên, đối với những nhu cầu thu thập dữ liệu phức tạp hơn, chẳng hạn như render các trang nặng JavaScript, vượt qua CAPTCHA, quản lý các nhóm proxy lớn, hoặc xử lý các cơ chế chống bot tinh vi, Fetch API gốc có thể không đủ. Trong những trường hợp như vậy, các công cụ và dịch vụ chuyên dụng như Scrapeless thường hiệu quả hơn, vì chúng cung cấp cơ sở hạ tầng và các tính năng chuyên biệt để xử lý những phức tạp này.

Tài liệu tham khảo

  1. Blog Cloudflare - Giới thiệu thông tin lưu lượng yêu cầu HTTP trên Cloudflare Radar
  2. Kho lưu trữ HTTP - Báo cáo: Tình trạng của Web
  3. Tài liệu Web MDN - Sử dụng Fetch API

Tại Scrapless, chúng tôi chỉ truy cập dữ liệu có sẵn công khai trong khi tuân thủ nghiêm ngặt các luật, quy định và chính sách bảo mật trang web hiện hành. Nội dung trong blog này chỉ nhằm mục đích trình diễn và không liên quan đến bất kỳ hoạt động bất hợp pháp hoặc vi phạm nào. Chúng tôi không đảm bảo và từ chối mọi trách nhiệm đối với việc sử dụng thông tin từ blog này hoặc các liên kết của bên thứ ba. Trước khi tham gia vào bất kỳ hoạt động cạo nào, hãy tham khảo ý kiến ​​cố vấn pháp lý của bạn và xem xét các điều khoản dịch vụ của trang web mục tiêu hoặc có được các quyền cần thiết.

Bài viết phổ biến nhất

Danh mục