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!"];
}];
0Trong 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.