معالجة الأخطاء
جزء من قسم أساسيات Node.js في رحلة Node.js على Coddy. الدرس 16 من 33.
قد يتلف ملف notes.json إذا عُدّل يدويًا. عندئذٍ يُطلق JSON.parse خطأً، ويطبع Node تتبّع المكدس: قائمة طويلة من أسطر التعليمات البرمجية التي أدّت إلى الخطأ.
ينفّذ try تعليمات برمجية قد تُطلق خطأً. وعندما يحدث ذلك، يستقبل catch الخطأ ويقرّر برنامجك ما سيقوله. يمثّل err.message سبب الخطأ في سطر واحد.
let config;
try {
config = JSON.parse('{ port: 3000 }');
} catch (err) {
console.error(`config is broken: ${err.message}`);
process.exit(1);
}لا تلتقط الخطأ وتتابع التنفيذ بقائمة فارغة: فعملية add التالية ستحفظ فوق الملف التالف، وستُفقد كل ملاحظة فيه.
التحدي
سهلعدّل أحدهم notes.json يدويًا وترك فاصلة زائدة. والآن يطرح JSON.parse خطأً، ويطبع Node تتبّعًا طويلًا للمكدس. اجعل الأداة تطبع سطرًا واحدًا واضحًا بدلًا من ذلك، ثم تتوقف، حتى لا تحفظ أبدًا فوق الملف التالف.
- في
store.js، اعثر على موضع تحميل الملاحظات:JSON.parse(readFileSync(...))، داخل الكائنstore. التقط الخطأ الذي يطرحهJSON.parseعندما لا يكون الملف بتنسيق JSON صالح. لا يمكن وضعtryداخل كائن، لذا انقل التحميل إلى دالة أو متغيّر أعلى الكائن، واستخدم نتيجته فيnotes. - عندما يفشل التحليل، اطبع سطرًا واحدًا إلى stderr، ثم اخرج برمز 1. يبدأ السطر بـ
notes.json is damaged:ويتبعه نص رسالة الخطأ، وهو سبب الخطأ الذي يوضحهJSON.parse، مثلUnexpected token ']'. لا تطبع تتبّع المكدس. ولا تتابع التنفيذ بقائمة فارغة: إذ إن أمرaddالتالي سيحفظ فوق الملاحظات التالفة. - إذا كان
notes.jsonمفقودًا، فهذا يعني أن المخزن فارغ، كما في السابق. يُجرى هذا الفحص مع كل أمر، لأن كل أمر يحمّل المخزن.
جرّب ذلك: اكتب list في المربع بعد $ node notes.js قبل أن تغيّر أي شيء. سترى تتبّعًا أحمر للمكدس. بعد التغيير، لن يطبع list سوى السطر الأحمر notes.json is damaged: ... ورمز الخروج 1. لرؤية ملاحظاتك مجددًا، احذف الفاصلة بعد "Call Ada" في notes.json وشغّل list. ثم أعد الفاصلة قبل أن تضغط «تحقق»: تحتاج عمليات التحقق إلى الملف التالف، وإعادة تعيين الملفات لا تتراجع عن تعديلاتك.
جرّب بنفسك
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;
جميع دروس أساسيات Node.js
1تشغيل JavaScript على Node
مرحبًا يا Nodeقراءة الأمروسائط سطر الأوامرالأوامرتدرّب بنفسك: Playground لـ Express