Hướng dẫn API tìm nạp JavaScript: GET, POST, Xử lý lỗi và hết thời gian chờ

  1. Trang chủ
  2. Blog
  3. Phát triển phần mềm

Phát triển phần mềm

Hướng dẫn API tìm nạp JavaScript: GET, POST, Xử lý lỗi và hết thời gian chờ

Tìm nạp là cách tích hợp sẵn để gọi API từ JavaScript, nhưng nó có một điều bất ngờ khiến hầu hết mọi người đều chú ý. Tìm hiểu cách gửi yêu cầu, xử lý mọi loại lỗi và xây dựng một công cụ trợ giúp nhỏ mà bạn có thể sử dụng lại.

Đọc 9 phút
Hướng dẫn API tìm nạp JavaScript: GET, POST, xử lý lỗi và hết thời gian chờ

Điểm chính

  • fetch() trả lại lời hứa cho Response và việc đọc nội dung mất một giây await.
  • Các lỗi HTTP như 404 và 500 không từ chối, vì vậy hãy luôn kiểm tra response.ok.
  • Để gửi JSON, hãy sử dụng JSON.stringify và đặt tiêu đề Content-Type.
  • Tìm nạp không có tùy chọn thời gian chờ mặc định, vì vậy hãy sử dụng AbortSignal.timeout().

Hầu hết các ứng dụng web hiện đại đều liên tục giao tiếp với máy chủ. API tìm nạp JavaScript là cách tiêu chuẩn để thực hiện điều đó và được tích hợp vào trình duyệt cũng như Node.js 18 trở lên nên không cần phải cài đặt.

Việc sử dụng cơ bản cần hai dòng, tuy nhiên nhiều hướng dẫn chỉ dừng lại ở đó và bỏ qua phần gây ra lỗi thực sự: xử lý lỗi. Chúng tôi đã thử nghiệm các ví dụ trong hướng dẫn này trên một máy chủ cục bộ nhỏ trên Node.js 24 và kết quả hiển thị là từ lần chạy đó. example.com trong mã là viết tắt của API của riêng bạn. Nếu lời hứa là điều mới mẻ đối với bạn, hãy bắt đầu với Giải thích về lời hứa JavaScript.

API tìm nạp là gì?

Tìm nạp là giao diện dựa trên lời hứa để thực hiện các yêu cầu HTTP. Nó thay thế cái cũ hơn, dựa trên cuộc gọi lại XMLHttpRequest và nhiều dự án hiện sử dụng nó thay vì thêm thư viện cho các cuộc gọi đơn giản.

tính năng Tìm nạp Axios (thư viện)
Cài đặt Được xây dựng trong Đã thêm dưới dạng phụ thuộc
Nội dung JSON Hãy tự xâu chuỗi nó tự động
Phân tích phản hồi JSON Gọi response.json() tự động
Lỗi HTTP bị từ chối? Không Có, theo mặc định
Hết giờ Thông qua AbortSignal Tùy chọn timeout

Một yêu cầu NHẬN

Fetch thực hiện yêu cầu GET theo mặc định. Có hai bước và mỗi bước cần await: đầu tiên các tiêu đề phản hồi đến và sau đó bạn đọc nội dung.

const response = await fetch("https://example.com/users/1");
const user = await response.json();

console.log(user);

// { id: 1, name: 'Asha' }

Hai bước tồn tại vì phần thân có thể lớn và đến muộn hơn các tiêu đề. Trong tập lệnh trình duyệt, cấp cao nhất await cần một mô-đun, vì vậy bạn thường sẽ đặt mô-đun này bên trong hàm async. Xem Hướng dẫn chờ đợi/không đồng bộ JavaScript của chúng tôi.

Đối tượng phản hồi

Trước khi đọc nội dung, bạn có thể kiểm tra phản hồi:

console.log(response.status, response.ok, response.headers.get("content-type"));

// 200 true application/json
Thuộc tính hoặc phương thức Cung cấp cho bạn
response.ok true cho trạng thái 200 đến 299
response.status Mã trạng thái, chẳng hạn như 404
response.headers.get(name) Một tiêu đề phản hồi
response.json() Nội dung được phân tích cú pháp dưới dạng JSON
response.text() Thân xác như một sợi dây
response.blob() Dữ liệu nhị phân, chẳng hạn như hình ảnh

Một nội dung chỉ có thể được đọc một lần. Gọi json() lần thứ hai không thành công trong thử nghiệm của chúng tôi:

await res.json();
await res.json();

// TypeError: Body is unusable: Body has already been read

Nếu bạn cần đọc nó hai lần, hãy gọi response.clone() trước.

Điều ngạc nhiên lớn: 404 không ném

Đây là điều quan trọng nhất trong bài viết này. Chúng tôi đã yêu cầu một người dùng không tồn tại:

const res = await fetch("https://example.com/users/999");
console.log(res.status, res.ok);

// 404 false

Không có ngoại lệ nào được ném ra. Về phần tìm nạp, yêu cầu đã hoạt động: máy chủ đã được truy cập và nó đã phản hồi. Lời hứa chỉ từ chối khi không có phản hồi nào có thể sử dụng được, chẳng hạn như lỗi mạng. Vì vậy, mã như thế này có một lỗi ẩn:

try {
  const res = await fetch(url);
  const data = await res.json();   // may be an error payload
  showUser(data);                  // runs anyway for 404 and 500
} catch (error) {
  showError();                     // does not run for 404 or 500
}

Hãy kiểm tra Bảng tóm tắt mã trạng thái HTTP của chúng tôi để biết ý nghĩa của từng mã.

Một người trợ giúp có thể tái sử dụng

Đừng lặp lại việc kiểm tra đó ở mọi nơi. Bọc nó một lần:

async function getJson(url, options) {
  const response = await fetch(url, options);
  if (!response.ok) {
    throw new Error(`Request failed with status ${response.status}`);
  }
  return response.json();
}

try {
  await getJson("https://example.com/users/999");
} catch (error) {
  console.log("caught:", error.message);
}

// caught: Request failed with status 404

Bây giờ lỗi HTTP và lỗi mạng đều có kết quả giống nhau catch. Chức năng nhỏ này đáng có trong mọi dự án. Phiên bản thực cũng có thể đọc thông báo lỗi từ nội dung phản hồi và xử lý phản hồi 204 No Content, không có JSON để phân tích cú pháp.

ĐĂNG dữ liệu JSON

Truyền một đối tượng tùy chọn làm đối số thứ hai. Đối với JSON, bạn phải tự mình thực hiện hai việc: chuyển đổi dữ liệu thành chuỗi và đặt tiêu đề.

const created = await getJson("https://example.com/users", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ name: "Ben" }),
});

console.log(created);

// { id: 2, name: 'Ben', type: 'application/json' }

Máy chủ thử nghiệm của chúng tôi phản hồi lại loại nội dung mà nó nhận được, xác nhận rằng tiêu đề đã đến. Việc quên tiêu đề đó là nguyên nhân phổ biến gây ra lỗi máy chủ khó hiểu, vì nhiều khung công tác chỉ phân tích cú pháp JSON khi nó được khai báo. Để tải lên một biểu mẫu hoặc các tệp, hãy chuyển một đối tượng FormData làm nội dung và thực hiện không đặt Content-Type, vì trình duyệt cần tự thêm một giá trị biên.

Các phương pháp và tùy chọn khác

Tùy chọn Ví dụ Mục đích
phương pháp "PUT", "PATCH", "DELETE" Phương thức HTTP
tiêu đề { Ủy quyền: "Người mang ..." } Tiêu đề yêu cầu
cơ thể JSON.stringify(data) Cơ quan yêu cầu
tín hiệu AbortSignal.timeout(5000) Đang hủy
thông tin xác thực "bao gồm" Gửi cookie có nguồn gốc chéo
bộ nhớ đệm "không có cửa hàng" Hành vi bộ đệm của trình duyệt

Lựa chọn giữa REST và các kiểu API khác? So sánh của chúng tôi về REST so với GraphQL cho thấy mức độ tìm nạp phù hợp với từng loại.

Chuỗi truy vấn

Không xây dựng chuỗi truy vấn bằng cách nối văn bản vì các ký tự đặc biệt sẽ ngắt chuỗi. URLSearchParams xử lý mã hóa cho bạn:

const params = new URLSearchParams({ q: "red shoes", page: 2 });
console.log(params.toString());

// q=red+shoes&page=2

await getJson(`https://example.com/search?${params}`);

// { q: 'red shoes', page: '2' }

Máy chủ đã nhận được red shoes chính xác và dung lượng đã được khôi phục.

Hết thời gian chờ và hủy

Tìm nạp sẽ đợi rất lâu trên một máy chủ chậm trừ khi bạn thông báo khác. AbortSignal.timeout() đặt ra giới hạn. Điểm cuối thử nghiệm của chúng tôi mất hai giây, so với giới hạn 200 mili giây:

try {
  await fetch("https://example.com/slow", { signal: AbortSignal.timeout(200) });
} catch (error) {
  console.log(error.name);
}

// TimeoutError

Để hủy thủ công, chẳng hạn như khi người dùng rời khỏi một trang hoặc nhập cụm từ tìm kiếm mới, hãy sử dụng AbortController:

const controller = new AbortController();
const pending = fetch("https://example.com/slow", { signal: controller.signal });

controller.abort();

try {
  await pending;
} catch (error) {
  console.log(error.name);
}

// AbortError

Để chạy nhiều yêu cầu cùng một lúc, hãy sử dụng Promise.all, nhanh hơn nhiều so với việc chờ từng yêu cầu một:

const [user, search] = await Promise.all([
  getJson("https://example.com/users/1"),
  getJson("https://example.com/search?q=a&page=1"),
]);

Mọi loại thất bại

Đây là hình ảnh của từng thất bại trong quá trình thực hiện của chúng tôi, cùng với cách phân biệt chúng:

Tình huống Chuyện gì xảy ra Làm thế nào để phát hiện nó
Máy chủ trả về 404 hoặc 500 Lời hứa thực hiện response.ok là sai
Không thể truy cập máy chủ Từ chối với TypeError bắt
Đã hết thời gian chờ Từ chối với TimeoutError error.name
Đã hủy thủ công Từ chối với AbortError error.name
Nội dung JSON không hợp lệ json() từ chối với SyntaxError bắt

Hàng cuối cùng đó là phổ biến trong sản xuất. Proxy trả về 502 thường gửi trang lỗi HTML. Chúng tôi đã sao chép lại điều này và res.json() đã ném SyntaxError. Kiểm tra response.ok trước khi phân tích cú pháp có nghĩa là bạn báo cáo vấn đề thực sự chứ không phải lỗi phân tích cú pháp khó hiểu.

Mẹo: Hãy cố ý kiểm tra các đường dẫn lỗi này. Các công cụ dành cho nhà phát triển trình duyệt có thể mô phỏng trạng thái ngoại tuyến và các công cụ kiểm tra có thể mô phỏng phản hồi 500. Hướng dẫn kiểm tra API với Postman của chúng tôi bao gồm việc kiểm tra phía API.

CORS và thông tin xác thực

Trong trình duyệt, yêu cầu từ nguồn này đến nguồn khác phải tuân theo CORS, quy tắc chia sẻ tài nguyên giữa nhiều nguồn. Nếu bạn thấy lỗi đề cập đến Access-Control-Allow-Origin, thì cách khắc phục thuộc về máy chủ, máy chủ này phải cho phép trang web của bạn. Trong JavaScript của bạn, lỗi chỉ hiển thị dưới dạng lỗi chung TypeError, vì vậy hãy xem bảng điều khiển trình duyệt để biết lý do thực tế. Node.js không thực thi CORS, do đó, một yêu cầu hoạt động trong tập lệnh vẫn có thể bị lỗi trong trình duyệt.

Theo mặc định, trình duyệt không gửi cookie theo yêu cầu có nguồn gốc chéo. Đặt credentials: "include" nếu bạn cần và đảm bảo máy chủ cho phép điều đó. Không bao giờ đặt các khóa API bí mật vào JavaScript của trình duyệt vì bất kỳ ai cũng có thể đọc được chúng. Giữ chúng trên máy chủ của bạn.

Những lỗi thường gặp

  • Không kiểm tra response.ok. Phản hồi lỗi được coi là thành công.
  • Quên điều thứ hai await. response.json() cũng trả lại một lời hứa.
  • Quên JSON.stringify. Truyền một vật khi cơ thể gửi [object Object].
  • Đặt Content-Type với FormData. Điều này phá vỡ ranh giới, vì vậy hãy loại bỏ nó.
  • Không có thời gian chờ. Yêu cầu bị treo có thể khiến vòng quay của trang chạy vô thời hạn.
  • Phân tích cú pháp JSON để có phản hồi trống. A 204 không có nội dung và json() sẽ ném.

Lời kết

Tìm nạp rất đơn giản khi bạn nhớ quy tắc chính của nó: một phản hồi không giống như một thành công. Sao chép trình trợ giúp nhỏ vào dự án của bạn, thêm thời gian chờ và kiểm tra các đường dẫn thất bại của bạn. Bước tiếp theo, hãy xây dựng một trang nhỏ tải dữ liệu từ API, hiển thị thông báo lỗi rõ ràng và cho phép người dùng hủy tìm kiếm chậm.

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

Tìm nạp có gây ra lỗi trên 404 không?

Không. Việc tìm nạp chỉ từ chối khi không nhận được phản hồi nào, chẳng hạn như khi mạng bị lỗi. Đối với các lỗi HTTP, hãy tự kiểm tra phản hồi.ok hoặc phản hồi.status.

Làm cách nào để gửi JSON bằng cách tìm nạp?

Đặt phương thức thành POST, thêm tiêu đề Kiểu nội dung của ứng dụng/json và chuyển dữ liệu qua JSON.stringify làm nội dung.

Tại sao tôi cần hai lần chờ khi tìm nạp?

Việc đầu tiên được giải quyết khi tiêu đề phản hồi đến. Việc thứ hai chờ nội dung tải xuống và được phân tích cú pháp, việc này có thể xảy ra sau.

Làm cách nào để đặt thời gian chờ khi tìm nạp?

Tín hiệu truyền: AbortSignal.timeout(5000) trong các tùy chọn. Sau đó, yêu cầu sẽ từ chối với TimeoutError nếu mất nhiều thời gian hơn nhiều mili giây.

Tìm nạp có sẵn trong Node.js không?

Đúng. Tìm nạp có sẵn trên toàn cầu trong Node.js 18 trở lên. Các phiên bản cũ hơn cần một gói, mặc dù quy tắc CORS chỉ áp dụng trong trình duyệt.

Tiếp tục học hỏi

Làm việc với Stack Quora

Cần trợ giúp về kiểm tra, WordPress hoặc SEO?

Chúng tôi giúp các nhóm phát triển phần mềm tốt hơn và phát triển trang web của họ. Hãy cho chúng tôi biết bạn đang làm gì và chúng tôi sẽ đề xuất bước tiếp theo rõ ràng.

Tiếp tục đọc

Thêm hướng dẫn về thử nghiệm, AI và phát triển hiện đại

Bạn thích bài viết này? Chọn một chủ đề và chuyển ngay sang phần hướng dẫn mới nhất của chúng tôi.

Trí tuệ nhân tạo

Giải thích về ảo giác AI: Tại sao các mô hình ngôn ngữ lại tạo nên mọi thứ và cách giảm thiểu nó

Ảo giác AI đã giải thích: chúng là gì, tại sao mô hình ngôn ngữ tạo ra chúng, các loại phổ biến, cách giảm thiểu chúng bằng cách căn cứ và nhắc nhở …

Đọc bài viết →
DevOps

Giải thích về các biến môi trường: Tệp .env, bí mật và cấu hình được thực hiện đúng

Các biến môi trường được giải thích bằng các ví dụ Python mà chúng tôi đã chạy: đọc và thiết lập chúng, tại sao mọi giá trị đều là một chuỗi, tệp .e…

Đọc bài viết →
Phát triển phần mềm

Giải thích về giới hạn tỷ lệ API: Thuật toán, tiêu đề và xử lý lỗi 429

Giới hạn tốc độ API được giải thích bằng mô phỏng mà chúng tôi đã chạy: nhóm mã thông báo, cửa sổ cố định, cửa sổ trượt, 429 phản hồi, tiêu đề giới …

Đọc bài viết →
Tự động hóa kiểm thử

Chế giễu bằng Python: unittest.mock, patch và những sai lầm khiến bài kiểm tra nói dối

Mô phỏng bằng Python với unittest.mock, đã được thử nghiệm: Mock và return_value, side_effect, vá lỗi nơi sử dụng tên, thông số kỹ thuật và thông số…

Đọc bài viết →
Kiểm thử phần mềm

Giải thích về phạm vi bảo hiểm của mã: Phạm vi tuyến so với chi nhánh và ý nghĩa thực sự 100%

Phạm vi bảo hiểm mã được giải thích bằng cách chạy phạm vi bảo hiểm thực tế: phạm vi bảo hiểm dòng, chi nhánh và điều kiện, đọc báo cáo, lý do tại s…

Đọc bài viết →
Cơ sở dữ liệu & SQL

DELETE vs TRUNCATE vs DROP trong SQL: Sự khác biệt, khôi phục và thời điểm sử dụng mỗi loại

DELETE vs TRUNCATE vs DROP được giải thích bằng SQL đã được thử nghiệm: mỗi loại loại bỏ, khôi phục, kích hoạt, đặt lại danh tính, tốc độ và Postgre…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Giải thích về Chế độ xem SQL: Tạo, sử dụng và tránh những cạm bẫy, kèm theo ví dụ

Chế độ xem SQL được giải thích bằng các truy vấn chúng tôi đã chạy: tạo chế độ xem, kết quả trực tiếp, ẩn cột, hiệu suất, chế độ xem có thể cập nhật…

Đọc bài viết →
Phát triển phần mềm

Giao diện TypeScript so với loại: Sự khác biệt thực sự, được thử nghiệm bằng trình biên dịch

Giao diện TypeScript so với loại, được kiểm tra bằng trình biên dịch thực: cả hai có thể làm gì, chỉ một người có thể làm gì, hợp nhất khai báo, mở …

Đọc bài viết →
Phát triển phần mềm

Giải thích về Python *args và **kwargs: Hàm linh hoạt với ví dụ rõ ràng

Python *args và **kwargs được giải thích bằng mã chúng tôi đã chạy: đóng gói và giải nén, thứ tự tham số, đối số chỉ từ khóa và chỉ vị trí, trình tr…

Đọc bài viết →
Phát triển phần mềm

Hàm Lambda của Python: Cú pháp, cách sử dụng thực tế và khi nào không nên sử dụng chúng

Các hàm lambda của Python được giải thích bằng mã chúng tôi đã chạy: cú pháp, sắp xếp bằng khóa, bản đồ và bộ lọc, các phần đóng, bẫy liên kết muộn …

Đọc bài viết →
Trí tuệ nhân tạo

Đại lý AI là gì? Cách chúng hoạt động, với vòng lặp tác nhân đơn giản, bạn có thể chạy

Tác nhân AI là gì? Hướng dẫn đơn giản về vòng lặp tác nhân, công cụ, bộ nhớ và lan can, với một vòng lặp Python nhỏ mà chúng tôi đã chạy, những rủi …

Đọc bài viết →
DevOps

Giám sát và Khả năng quan sát: Sự khác biệt thực sự, với nhật ký, số liệu và dấu vết

Giải thích về giám sát và khả năng quan sát: lỗi đã biết và chưa biết, nhật ký, số liệu và dấu vết, hướng dẫn về sự cố thanh toán, tín hiệu vàng, Op…

Đọc bài viết →
DevOps

Docker Volumes vs Bind Mounts: Duy trì dữ liệu vùng chứa đúng cách

Giải thích về khối lượng Docker và liên kết gắn kết: tại sao dữ liệu vùng chứa biến mất, khối lượng được đặt tên, liên kết gắn kết, tmpfs, ví dụ về …

Đọc bài viết →
Tự động hóa kiểm thử

TDD vs BDD: Key Differences, One Feature Built Both Ways and When to Use Each

TDD và BDD được giải thích bằng một tính năng giảm giá được xây dựng theo cả hai cách: tái cấu trúc màu đỏ-xanh với mã chúng tôi đã chạy, kịch bản C…

Đọc bài viết →
Kiểm thử phần mềm

Kiểm tra chấp nhận của người dùng (UAT): Quy trình, danh sách kiểm tra và ví dụ thực tế

Giải thích về thử nghiệm chấp nhận của người dùng: ai chạy nó, nó khác với QA như thế nào, quy trình bảy bước, mẫu trường hợp thử nghiệm UAT, danh s…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Giải thích về các giá trị NULL của SQL: IS NULL, COALESCE, NULLIF và những cái bẫy cần tránh

Các giá trị SQL NULL được giải thích bằng các truy vấn chúng tôi đã chạy: logic ba giá trị, IS NULL, COALESCE, NULLIF, cách tổng hợp, kết hợp và sắp…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Câu lệnh SQL CASE WHEN: Cú pháp, ví dụ thực tế và các lỗi thường gặp

TRƯỜNG HỢP SQL KHI được giải thích bằng các truy vấn mà chúng tôi đã chạy: các biểu mẫu đơn giản và được tìm kiếm, thứ tự điều kiện, các thủ thuật S…

Đọc bài viết →
Phát triển phần mềm

JWT là gì? Mã thông báo Web JSON được giải thích bằng một ví dụ hoạt động

JWT là gì? Mã thông báo Web JSON đã giải thích: ba phần, mã thông báo được xây dựng và giả mạo trong mã chúng tôi đã chạy, JWT so với phiên, lưu trữ…

Đọc bài viết →
Phát triển phần mềm

Giải thích về vòng lặp sự kiện JavaScript: Ngăn xếp cuộc gọi, Microtask và bộ hẹn giờ kèm ví dụ

Vòng lặp sự kiện JavaScript được giải thích bằng mã chúng tôi đã chạy: ngăn xếp cuộc gọi, hàng đợi tác vụ và vi nhiệm, tại sao setTimeout 0 không di…

Đọc bài viết →
Phát triển phần mềm

Giải thích về trình tạo và năng suất của Python: Tiết kiệm bộ nhớ bằng các ví dụ thực tế

Trình tạo và lợi nhuận Python được giải thích bằng mã chúng tôi đã chạy: cách chúng tạm dừng và tiếp tục, đo mức tiết kiệm bộ nhớ, quy trình, chuỗi …

Đọc bài viết →
Trí tuệ nhân tạo

Nhúng là gì? Giải thích sự tương đồng về vectơ và Cosine một cách đơn giản

nhúng là gì? Hướng dẫn bằng ngôn ngữ đơn giản về vectơ, độ tương tự cosine và tìm kiếm ngữ nghĩa, với một ví dụ nhỏ mà chúng tôi đã chạy, các cách s…

Đọc bài viết →
DevOps

Triển khai Blue-Green và Canary: Sự khác biệt, sự đánh đổi và cách lựa chọn

Giải thích về triển khai Blue-green và Canary: cách hoạt động của từng loại, chi phí, rủi ro và khôi phục, nhóm người dùng ổn định mà chúng tôi đã t…

Đọc bài viết →
Tự động hóa kiểm thử

Kiểm tra không ổn định: Nguyên nhân gây ra chúng và cách khắc phục chúng vĩnh viễn

Các thử nghiệm không ổn định được giải thích bằng các bản demo mà chúng tôi đã chạy: nguyên nhân chính, cách xác nhận và chẩn đoán nguyên nhân, cách…

Đọc bài viết →
Kiểm thử phần mềm

Kiểm tra tải và kiểm tra căng thẳng: Sự khác biệt, số liệu và ví dụ về k6

Giải thích về thử nghiệm tải và thử nghiệm căng thẳng: mỗi thử nghiệm chứng minh điều gì, thử nghiệm tăng đột biến và ngâm, số liệu quan trọng, lý d…

Đọc bài viết →
Kiểm thử phần mềm

Trường hợp thử nghiệm và kịch bản thử nghiệm: Sự khác biệt chính, ví dụ và thời điểm sử dụng từng trường hợp

Giải thích trường hợp kiểm thử và kịch bản kiểm thử: định nghĩa rõ ràng, bảng cạnh nhau, một tính năng đặt lại mật khẩu được lấy từ các tình huống n…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Tối ưu hóa truy vấn SQL: Đọc kế hoạch thực thi và sửa các truy vấn chậm, có tính thời gian

Đã thử nghiệm tối ưu hóa truy vấn SQL trên một triệu hàng: đọc kế hoạch thực hiện, thêm chỉ mục phù hợp, sửa các bộ lọc không thể mở rộng, sử dụng c…

Đọc bài viết →
Cơ sở dữ liệu & SQL

SQL UNION và UNION ALL: Sự khác biệt, ví dụ và hiệu suất đã được kiểm tra

SQL UNION và UNION ALL được giải thích bằng các truy vấn chúng tôi đã chạy: trùng lặp, cả hai quy tắc đều tuân theo, lỗi dữ liệu thực, hiệu suất đượ…

Đọc bài viết →
Phát triển phần mềm

Hướng dẫn API tìm nạp JavaScript: GET, POST, Xử lý lỗi và hết thời gian chờ

Hướng dẫn API tìm nạp JavaScript đã được thử nghiệm trên máy chủ cục bộ: GET và POST, tại sao 404 không gửi, trình trợ giúp có thể sử dụng lại, chuỗ…

Đọc bài viết →
Phát triển phần mềm

Xử lý tệp Python: Đọc, ghi, CSV, JSON và pathlib kèm ví dụ

Việc xử lý tệp Python được giải thích bằng mã chúng tôi đã chạy: chế độ mở, với, đọc tệp lớn, CSV, JSON, pathlib, tệp nhị phân, ghi an toàn, xử lý l…

Đọc bài viết →
Phát triển phần mềm

Git merge vs rebase: khác biệt, ví dụ và khi nào dùng cái nào

Git merge vs rebase được giải thích bằng đầu ra log thực tế, bảng so sánh, quy tắc vàng của rebase và quy trình làm việc nhóm an toàn.

Đọc bài viết →
Phát triển phần mềm

List comprehension trong Python: cú pháp, ví dụ và khi nào nên tránh

List comprehension trong Python: cú pháp, lọc dữ liệu, if-else, vòng lặp lồng nhau, thời gian đo thực tế và khi nào vòng lặp for thông thường tốt hơn.

Đọc bài viết →
Cơ sở dữ liệu & SQL

Giải thích SQL JOIN kèm ví dụ (Inner, Left, Right, Full)

Hiểu SQL JOIN từng bước với bảng và truy vấn mẫu: INNER, LEFT, RIGHT, FULL, CROSS và SELF, cùng lỗi thường gặp và mẹo hiệu năng.

Đọc bài viết →