Xử lý lỗi
Thuộc phần Kiến thức cơ bản về Node.js trong hành trình Node.js của Coddy. Bài học 16 trên 33.
Tệp notes.json được chỉnh sửa thủ công có thể bị hỏng. Khi đó, JSON.parse sẽ ném ra lỗi, và Node in ra dấu vết ngăn xếp: danh sách dài các dòng code dẫn đến lỗi.
try chạy đoạn code có thể ném ra lỗi. Khi có lỗi, catch nhận lỗi đó và chương trình của bạn quyết định cần thông báo gì. err.message là lý do được tóm tắt trong một dòng.
let config;
try {
config = JSON.parse('{ port: 3000 }');
} catch (err) {
console.error(`config is broken: ${err.message}`);
process.exit(1);
}Đừng bắt lỗi rồi tiếp tục chạy với một danh sách trống: lần add tiếp theo sẽ ghi đè lên tệp bị hỏng, khiến mọi ghi chú trong đó biến mất.
Thử thách
DễCó người đã chỉnh sửa notes.json bằng tay và để thừa một dấu phẩy. Giờ đây, JSON.parse báo lỗi và Node in ra một dấu vết ngăn xếp dài. Hãy sửa công cụ để chỉ in một dòng rõ ràng rồi dừng lại, nhờ đó nó không bao giờ ghi đè lên tệp bị hỏng.
- Trong
store.js, tìm chỗ tải ghi chú:JSON.parse(readFileSync(...)), bên trong đối tượngstore. Bắt lỗi màJSON.parsebáo khi tệp không chứa JSON hợp lệ. Không thể đặttrybên trong một đối tượng, vì vậy hãy chuyển phần tải vào một hàm hoặc biến ở phía trên đối tượng, rồi dùng kết quả đó chonotes. - Khi phân tích cú pháp thất bại, hãy in một dòng ra stderr rồi thoát với mã 1. Dòng này bắt đầu bằng
notes.json is damaged:và tiếp theo là thông báo lỗi, nêu lý doJSON.parsebáo lỗi, chẳng hạn nhưUnexpected token ']'. Đừng in dấu vết ngăn xếp. Đừng tiếp tục với một danh sách rỗng: lệnhaddtiếp theo sẽ ghi đè lên các ghi chú bị hỏng. - Nếu thiếu
notes.json, kho dữ liệu vẫn rỗng như trước. Việc kiểm tra chạy với mọi lệnh, vì lệnh nào cũng tải kho dữ liệu.
Thử nhé: trước khi thay đổi gì, hãy nhập list vào ô sau $ node notes.js. Bạn sẽ thấy dấu vết ngăn xếp màu đỏ. Sau khi sửa, list chỉ in dòng màu đỏ notes.json is damaged: ... rồi thoát với mã 1. Để xem lại ghi chú, hãy xóa dấu phẩy sau "Call Ada" trong notes.json rồi chạy list. Sau đó, hãy thêm lại dấu phẩy trước khi nhấn «Kiểm tra»: các lượt kiểm tra cần tệp bị hỏng, còn nút Đặt lại tệp không hoàn tác những chỉnh sửa bạn tự thực hiện.
Tự làm thử
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
const file = 'notes.json';
const store = {
notes: existsSync(file) ? JSON.parse(readFileSync(file, 'utf8')) : [],
save() {
writeFileSync(file, JSON.stringify(this.notes, null, 2));
},
add(text) {
this.notes.push(text);
this.save();
return this.notes.length;
},
remove(n) {
const [text] = this.notes.splice(n - 1, 1);
this.save();
return text;
},
};
export default store;
Tất cả bài học trong Kiến thức cơ bản về Node.js
1Chạy JavaScript trên Node
Xin chào, NodeĐọc lệnhĐối số dòng lệnhCác lệnhTự luyện tập: Playground Express