Viết tệp nodejs

Hoạt động đồng bộ trong mô hình lập trình thường chỉ ra rằng mỗi câu lệnh được thực hiện lần lượt và câu lệnh tiếp theo không được thực thi cho đến khi câu lệnh hiện tại chạy xong. Trong khi hoạt động không đồng bộ, nhiều câu lệnh có thể được thực thi đồng thời mà không can thiệp vào việc thực thi của nhau

Nút. js cung cấp một số phương thức cho từng thao tác này và trong phần tiếp theo, chúng ta sẽ xem xét kỹ lưỡng từng thao tác để giúp bạn chọn nên sử dụng thao tác nào trong dự án của mình

phương pháp không đồng bộ

Sử dụng fs. writeFile()

Nếu tệp đã tồn tại, phương pháp này sẽ thay thế nội dung của tệp bằng dữ liệu được chỉ định mới; . Ngoài ra, fs. phương thức writeFile yêu cầu ba tham số. tên tệp hoặc bộ mô tả tệp, dữ liệu được ghi vào tệp và hàm gọi lại để xử lý giá trị được trả về

Ví dụ: nếu chúng tôi muốn ghi "John Doe" vào một tệp có tên "name. txt," mã của chúng tôi sẽ trông như thế này


const fs = require("fs");

let name = "John Doe";
fs.writeFile("name.txt", name, (err) => {
  if (err) {
    console.log(err);
  }
  console.log("File saved!");
});

Bằng cách thêm một chuỗi tùy chọn vào phương thức này, chúng tôi cũng có thể chỉ định loại mã hóa cho tệp


fs.writeFile("name.txt", "John Doe", "utf8", (err) => {
  console.log("File saved!");
});

Ngoài ra, đối với kỹ thuật ghi tệp nâng cao hơn, chúng ta có thể chỉ định một đối tượng thay cho mã hóa dưới dạng chuỗi để thêm một số lựa chọn khác như chế độ ghi tệp, tín hiệu kết thúc quá trình tạo tệp và loại mã hóa.


fs.writeFile("name.txt", "John Doe", {
  encoding: "utf8",
  flag: "w",
  // ...
  
}, (err) => {
  console.log("File saved!");
});

Sử dụng fs. viết()

fs. write() là một hàm cấp thấp để ghi dữ liệu chuỗi hoặc bộ đệm vào một tệp không đồng bộ. Phương pháp này được coi là cấp thấp vì nó chỉ có thể ghi vào tệp và sẽ không tạo tệp nếu tệp chưa tồn tại. Do đó, nó thường được sử dụng thay thế cho fs. open(), trước tiên sẽ mở tệp (hoặc tạo tệp nếu tệp không tồn tại) để sau đó chúng tôi có thể sử dụng hàm fs. write() để ghi dữ liệu vào nó


const fs = require("fs");
let name = "John Doe";

fs.open("name.txt", "a", (err, fd) => {
  if (err) {
    console.log(err);
  } else {
    console.log(fd);
    fs.write(fd, name, (err, bytes) => {
      if (err) {
        console.log(err.message);
      } else {
        console.log(bytes + " bytes written");
      }
    });
  }
});

Chúng tôi có thể tùy chọn cung cấp vị trí trong tệp để bắt đầu ghi dữ liệu vào tệp, cũng như phần dữ liệu để ghi ra tệp, sử dụng kỹ thuật này. Tuy nhiên, để làm như vậy, dữ liệu đầu vào của chúng tôi phải là một bộ đệm, bộ đệm này cũng có thể được tạo dễ dàng bằng cách sử dụng Nút. mô-đun bộ đệm js


let buffer = new Buffer("John Doe");

fs.open("name.txt", "a", (err, fd) => {
  if (err) {
    console.log(err);
  } else {
    fs.write(fd, buffer, 0, buffer.length, (err, bytes) => {
      if (err) {
        console.log(err);
      } else {
        console.log(bytes + " bytes written");
      }
    });
  }
});

Sử dụng fs. tạoWriteStream()

fs. createWriteStream() sẽ tạo một luồng có thể ghi để chúng ta có thể ghi dữ liệu theo các khoảng thời gian. Phương pháp này đặc biệt hữu ích khi chúng ta cần ghi dữ liệu có sẵn trên các nguồn khác, chẳng hạn như máy chủ của bên thứ ba và cũng có thể là một tùy chọn tốt hơn so với các phương pháp như fs. writeFile khi ghi một lượng lớn dữ liệu

Dưới đây là một ví dụ về cách chúng ta có thể sử dụng phương pháp này


const fs = require("fs");

let writer = fs.createWriteStream("sample.txt");
writer.write("Hello world!");

setTimeout(() => {
  writer.write("Hello again!");
}, 2000);

Như đã thấy trong ví dụ trên, chúng tôi đã tạo một luồng ghi, sau đó viết chuỗi "Xin chào thế giới. " vào tệp, sau đó, sau 2 giây, chúng tôi sử dụng hàm setTimeout để viết một chuỗi khác, "Xin chào lần nữa. " vào cùng một tệp

Phương thức createWriteStream cũng bao gồm một số sự kiện mà chúng ta có thể theo dõi tiến trình của luồng và cũng có thể phát hiện lỗi nếu có xảy ra


let writer = fs.createWriteStream("sample.txt");
writer.write("Hello world!");

setTimeout(() => {
  writer.write("Hello world!");
  writer.end();
}, 2000);

writer.on("finish", function () {
  console.log("file downloaded to ", "..");
});

writer.on("error", function (err) {
  console.log(err);
});

Sử dụng fs. lời hứa. writeFile()

Phương thức writeFile trong Node. js FS cũng có cú pháp dựa trên lời hứa có thể được sử dụng trong khối async/await để cung cấp cú pháp rõ ràng hơn trong khi tránh địa ngục gọi lại. Phương thức này hoạt động giống như phương thức writeFile tiêu chuẩn, ngoại trừ việc nó được sử dụng trong một hàm không đồng bộ và không yêu cầu gọi lại để xử lý phản hồi


const writeToFile = async () => {
  let response = await fs.promises.writeFile("sample.txt", "Hello world!");
};

Phương thức đồng bộ

Cả hai fs. writeFile() và fs. write() cung cấp giải pháp thay thế đồng bộ để ghi nội dung vào tệp theo cách chặn đồng thời. Nói cách khác, lần thực thi mã tiếp theo sẽ đợi cho đến khi thao tác ghi tệp hoàn tất trước khi tiếp tục. Các phương pháp ghi tệp này được sử dụng tốt nhất khi có một hành động đơn lẻ phải được hoàn thành trước khi bất kỳ quá trình thực thi mã bổ sung nào có thể diễn ra

Sử dụng fs. writeFileSync

Phương pháp này là tương đương đồng bộ của fs. writeFile() và nó chấp nhận các tham số giống nhau ngoại trừ hàm gọi lại

________số 8

Sử dụng fs. writeSync

Chúng tôi cũng có f. writeSync(), là đối tác chặn của fs. write() và sẽ chấp nhận các tham số giống như phương thức này, ngoại trừ chức năng gọi lại. Đây là một ví dụ về cách chúng ta có thể sử dụng fs. writeSync kết hợp với fs. openSync để ghi vào một tệp ở một vị trí cụ thể


const fd = fs.openSync("name.txt", "r+");
const text = "Janet Doe";
const position = 0;
const numberOfBytesWritten = fs.writeSync(fd, text, position, "utf8");
console.log(`Bytes written: ${numberOfBytesWritten}`);

Xử lý lỗi khi ghi tệp

Lỗi là không thể tránh khỏi khi viết mã và điều này áp dụng để làm việc với Nút. mô-đun hệ thống tệp js cũng vậy. Và như chúng ta đã thấy trong các phần trước của bài viết này, các hàm gọi lại trong các phương thức không đồng bộ được thảo luận bao gồm một đối số lỗi mà chúng ta có thể kiểm tra lỗi và xử lý chúng một cách thích hợp

Tuy nhiên, đối với các phương thức đồng bộ, chúng ta cũng có thể sử dụng khối try/catch để xử lý lỗi. Một ví dụ được cung cấp dưới đây


fs.writeFile("name.txt", "John Doe", "utf8", (err) => {
  console.log("File saved!");
});

0

Trong trường hợp này, nếu hệ thống tệp không thể ghi tệp này, thông báo lỗi sẽ được ghi vào bảng điều khiển

Sự kết luận

Nút. js cung cấp nhiều phương pháp khác nhau để ghi tệp vào đĩa, vì vậy điều quan trọng là phải biết giải pháp phù hợp cho trường hợp sử dụng dự định của bạn. Ở đây chúng tôi đã giới thiệu một số phương pháp phổ biến nhất được tìm thấy trong Node, giải thích sự khác biệt chính của chúng và cung cấp một số ví dụ cho từng phương pháp.

writeFileSync trong nút JS là gì?

writeFileSync() để ghi dữ liệu vào tệp . Cái sau là phương pháp đồng bộ để ghi dữ liệu vào tệp. fs. writeFileSync() là một phương thức đồng bộ và mã đồng bộ chặn việc thực thi chương trình. Do đó, nên sử dụng các phương thức không đồng bộ trong Node.

Sự khác biệt giữa writeFile và writeFileSync là gì?

Sự khác biệt duy nhất giữa writeFile và writeFileSync là ở bắt và xử lý lỗi ; .