Menu
CoddyTech

معالجة الأخطاء

جزء من قسم أساسيات 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 التالية ستحفظ فوق الملف التالف، وستُفقد كل ملاحظة فيه.

challenge icon

التحدي

سهل

عدّل أحدهم notes.json يدويًا وترك فاصلة زائدة. والآن يطرح JSON.parse خطأً، ويطبع Node تتبّعًا طويلًا للمكدس. اجعل الأداة تطبع سطرًا واحدًا واضحًا بدلًا من ذلك، ثم تتوقف، حتى لا تحفظ أبدًا فوق الملف التالف.

  1. في store.js، اعثر على موضع تحميل الملاحظات: JSON.parse(readFileSync(...))، داخل الكائن store. التقط الخطأ الذي يطرحه JSON.parse عندما لا يكون الملف بتنسيق JSON صالح. لا يمكن وضع try داخل كائن، لذا انقل التحميل إلى دالة أو متغيّر أعلى الكائن، واستخدم نتيجته في notes.
  2. عندما يفشل التحليل، اطبع سطرًا واحدًا إلى stderr، ثم اخرج برمز 1. يبدأ السطر بـ notes.json is damaged: ويتبعه نص رسالة الخطأ، وهو سبب الخطأ الذي يوضحه JSON.parse، مثل Unexpected token ']'. لا تطبع تتبّع المكدس. ولا تتابع التنفيذ بقائمة فارغة: إذ إن أمر add التالي سيحفظ فوق الملاحظات التالفة.
  3. إذا كان 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

تدرّب بنفسك: Playground لـ Express