Contents

Cách đọc và ghi tệp JSON trong Node.js

Có thể đọc và ghi các tệp JSON trong Node.js. Tất cả những gì bạn cần làm là sử dụng Mô-đun fs như được nêu chi tiết trong hướng dẫn dễ làm theo của chúng tôi.

Đọc và ghi tệp JSON trong Node.js

Ký hiệu đối tượng JavaScript (JSON) là một tiêu chuẩn truyền dữ liệu rất phổ biến, đặc biệt nổi tiếng về khả năng thể hiện thông tin có tổ chức một cách ngắn gọn. Định dạng này, được đặc trưng bởi tính chất văn bản của nó, tạo điều kiện cho người dùng dễ dàng hiểu, đồng thời cho phép hệ thống xử lý máy phân tích cú pháp và tạo liền mạch.

Việc sử dụng khả năng phân tích cú pháp tự động và tạo dữ liệu JSON trong Node.js tạo điều kiện thuận lợi cho việc lưu trữ, truyền tải và thao tác thông tin có cấu trúc hiệu quả và dễ dàng. Có được sự hiểu biết toàn diện về cách đọc, soạn và sửa đổi các tệp JSON thông qua việc sử dụng thành phần hệ thống tệp Node.js.

Mô-đun hệ thống tệp Node.js

Mô-đun hệ thống tệp Node.js, vốn được tích hợp trong môi trường Node.js, cho phép người dùng giao tiếp với hệ thống tệp trên thiết bị của họ thông qua nhiều chức năng khác nhau như đọc tệp, tạo tệp mới và xóa chúng, cùng nhiều chức năng khác.

Các chức năng do mô-đun hệ thống tập tin cung cấp có sẵn ở hai phương thức riêng biệt; chúng có thể tiến hành không đồng bộ hoặc đồng bộ. Hoạt động không đồng bộ không cản trở tiến trình ứng dụng của bạn vì chúng cho phép xử lý đồng thời với các tác vụ khác. Các phương thức theo mẫu này thường mang tên gọi biểu thị tính chất không đồng bộ của chúng. Ví dụ: người ta sẽ tìm thấy các ký hiệu như “Async” hoặc “await” được thêm vào tên phương thức, ví dụ: readFileAsync hoặc writeFileAsync .

Trong khi các phương thức đồng bộ tạm dừng việc thực thi chương trình cho đến khi hoàn thành hoạt động của hệ thống tệp, thì các phương thức không đồng bộ cho phép chương trình tiến hành đồng thời các tác vụ khác bằng cách sử dụng chức năng gọi lại thực thi khi kết thúc hoạt động. Các ví dụ minh họa bao gồm các hàm readFile và writeFile.

Để duy trì đặc tính không chặn của vòng lặp sự kiện và nâng cao hiệu quả cũng như tính kịp thời tổng thể của ứng dụng khi xử lý tệp, bắt buộc phải sử dụng các kỹ thuật không đồng bộ trong tất cả các tương tác với hệ thống tệp.

Trong các trường hợp cụ thể mà sự đơn giản là tối quan trọng và thao tác không thường xuyên, chẳng hạn như đối với các tác vụ tập lệnh cơ bản hoặc thao tác tệp sử dụng một lần, các phương pháp không đồng bộ có thể không cần thiết và các kỹ thuật đồng bộ có thể chứng tỏ là một giải pháp hiệu quả.

Đọc tệp JSON bằng mô-đun fs

Để xử lý tệp JSON bằng JavaScript không đồng bộ, cần phải nhập mô-đun hệ thống tệp không đồng bộ vào tệp tập lệnh chính. Điều này có thể đạt được bằng cách đưa một câu lệnh nhập vào đầu tệp, như minh họa bên dưới:

 const fs = require("node:fs/promises");

Nếu sử dụng bản phát hành Node.js cũ hơn phiên bản 18, người ta phải nhập mô-đun fs theo cách như sau:

 const fs = require("fs/promises");

Nếu muốn nhập mô-đun hoàn chỉnh, bao gồm cả thành phần đồng bộ và không đồng bộ, thì cần phải bỏ qua “/promise” khỏi câu lệnh nhập.

Bằng cách sử dụng hàm readFile , người ta có thể đọc nội dung của tệp JSON bằng cách cung cấp cả đường dẫn thư mục và đối tượng cấu hình tùy chọn làm tham số. Đối tượng cấu hình này có thể là một đối tượng JavaScript chứa nhiều tùy chọn đọc khác nhau hoặc một chuỗi đóng gói sơ đồ mã hóa được xác định trước.

Các tùy chọn đối tượng bao gồm:

Tham số được chỉ định xác định bộ ký tự được sử dụng trong quá trình đọc một tài liệu cụ thể, với cấu hình tiêu chuẩn là “utf8”, thường được sử dụng cho nội dung văn bản và “nhị phân” áp dụng cho các tệp dữ liệu phi văn bản.

Biểu tượng dấu hoa thị (*) theo sau là dấu ngoặc đơn, nằm trong dấu ngoặc nhọn ({}), biểu thị một đối số tùy chọn mặc định là giá trị “r”, viết tắt của chế độ đọc khi mở tệp trong một hệ thống tệp cụ thể. Các chế độ truy cập tệp phổ biến khác bao gồm “w” cho chế độ chỉ ghi và “a” cho chế độ chắp thêm.

Ví dụ:

 fs.readFile("./users.json", { encoding: "utf-8", flag: "r" })
  .then((data) => {
    const users = JSON.parse(data);
    console.log(users);
  })
  .catch((error) => {
    console.error('Error reading the JSON file:', error);
  });

Ứng dụng ngày nay được thiết kế để xử lý thông tin được lưu trữ trong một tệp có tên “users.json”, nằm ngay gần điểm thực thi của phần mềm. Để trích xuất nội dung của tệp cụ thể này, người ta có thể sử dụng chức năng tích hợp sẵn do ngôn ngữ lập trình đang được sử dụng cung cấp. Cụ thể, phương thức được gọi là “JSON.parse” có thể được gọi dựa trên dữ liệu được truy xuất để chuyển đổi nó thành đối tượng JavaScript. Bằng cách đó, người dùng có được khả năng tương tác và sửa đổi thông tin có trong đó, tất cả đều nằm trong giới hạn cơ sở mã của họ.

Khi xử lý các tệp JSON nhỏ hơn, người ta có thể sử dụng hàm require để phân tích cú pháp đồng bộ các tệp đó và chuyển đổi nội dung của chúng thành các đối tượng JavaScript. Tuy nhiên, đối với các tệp JSON quan trọng hơn hoặc khi làm việc trong ngữ cảnh không đồng bộ, bạn nên sử dụng phương thức fs.readFile thay thế. Điều quan trọng cần lưu ý là cách tiếp cận require có khả năng lưu toàn bộ nội dung của tệp vào bộ nhớ đệm, điều này có thể gây khó khăn nếu dữ liệu JSON trải qua những thay đổi thường xuyên.

Viết tệp JSON bằng mô-đun fs

Hàm writeFile cho phép tạo và ghi dữ liệu ở định dạng JSON bằng cách cung cấp cho nó ba tham số, cụ thể là đường dẫn tệp, dữ liệu được ghi và hàm gọi lại tùy chọn.

⭐Một đường dẫn tập tin.

Thông tin được dùng để lưu trữ trong một tệp có thể có nhiều dạng khác nhau như chuỗi, bộ đệm, đối tượng có thể lặp không đồng bộ hoặc đối tượng có thể lặp.

⭐Đối tượng cấu hình tùy chọn.

Cách tiếp cận cụ thể này sử dụng các hoạt động không đồng bộ nhằm mục đích ghi dữ liệu vào một tệp được chỉ định. Trong trường hợp tệp nói trên đã tồn tại, nội dung hiện tại của nó sẽ được thay thế bằng dữ liệu được cung cấp, thay thế hiệu quả mọi thông tin trước đó có thể đã được lưu trữ trong đó. Ngược lại, trong trường hợp tệp chưa tồn tại, kỹ thuật này sẽ tạo tệp và sau đó điền vào đó dữ liệu được truyền dưới dạng đầu vào, do đó đảm bảo rằng tất cả thông tin cần thiết được lưu thành công trong vị trí lưu trữ được chỉ định.

Ví dụ:

 const fakeUsers = [
  {
    id: 1,
    name: "John Doe",
    username: "johndoe123",
    address: {
      street: "123 Main St",
      city: "Anytown",
    },
  },
  {
    id: 2,
    name: "Jane Smith",
    username: "janesmith456",
    address: {
      street: "456 Elm St",
      city: "Another City",
    },
  }
];

fs.writeFile("./users.json", JSON.stringify(fakeUsers), {
  encoding: "utf-8",
  flag: "w",
}).catch((error) => {
  console.error('Error writing the JSON file:', error);
});

một chuỗi hoặc một bộ đệm. Nếu muốn lưu một đối tượng trong tệp đã nói, cần phải chuyển đổi nó thành một chuỗi bằng cách sử dụng phương thức JSON.stringify trước đó.

Cập nhật tệp JSON bằng mô-đun fs

Mã được cung cấp không cung cấp phương pháp trực tiếp để sửa đổi tệp vì việc ghi vào tệp sẽ xóa nội dung trước đó của nó.

Để vượt qua thử thách này, một cách tiếp cận là truy xuất nội dung hiện có của tệp bằng cách sử dụng hàm readFile. Sau đó, người ta có thể ghép dữ liệu đã cập nhật của họ với thông tin được truy xuất và cung cấp cả hai tập dữ liệu làm đầu vào cho hoạt động writeFile.

Chắc chắn, đây là một ví dụ về hàm trong Python thể hiện logic đã phác thảo:

 const updateFile = async (filePath, data) => {
  try {
    const fileContents = await fs.readFile(filePath, {
      encoding: "utf-8",
      flag: "r",
    });

    const fileData = JSON.parse(fileContents);

    const updatedFileData = [...fileData, ...data];

    await fs.writeFile(filePath, JSON.stringify(updatedFileData), {
      encoding: "utf-8",
      flag: "w",
    });

    return "File updated successfully";
  } catch (error) {
    console.error('Error updating the JSON file:', error);
  }
};

Bạn có thể gọi hàm như vậy:

 updateFile("./users.json", [
  {
    id: 4,
    name: "Jane Doe",
    username: "janedoe123",
    address: {
      street: "123 Main St",
      city: "Anytown",
    },
  },
  {
    id: 5,
    name: "John Smith",
    username: "johnsmith456",
    address: {
      street: "456 Elm St",
      city: "Another City",
    },
  }
]).then((message) => {
  console.log(message);
});

Đoạn mã này sẽ nối thông tin chi tiết của những người dùng được đề cập vào tệp JSON hiện có có tên là “users.json”.

Những cân nhắc về bảo mật khi đọc và ghi tệp JSON

Đảm bảo tính bảo mật của ứng dụng Node.js xử lý các tệp JSON là điều tối quan trọng, vì những hành động như vậy liên quan đến các khía cạnh quan trọng của biện pháp bảo vệ. Điều cần thiết là phải xác minh tính hợp lệ của dữ liệu JSON để đảm bảo tuân thủ các thông số kỹ thuật được xác định trước. Ngoài ra, việc hạn chế quyền truy cập vào tệp và xóa thông tin đầu vào của người dùng là những biện pháp hiệu quả chống lại các mối đe dọa tiềm ẩn như tấn công tiêm mã.