Menu
CoddyTech

قراءة المدخلات

جزء من قسم أساسيات Node.js في رحلة Node.js على Coddy. الدرس 30 من 33.

إضافة الملاحظات أمرًا واحدًا في كل مرة تكون بطيئة عندما تكون القائمة موجودة بالفعل في مكان آخر.

يمكن للبرنامج أيضًا قراءة الإدخال من stdin: نص يُكتب على لوحة المفاتيح أو يُرسل من ملف. على حاسوب محمول، يرسل cat numbers.txt | node sum.js ملفًا إلى stdin؛ ويُسمّى الرمز | أنبوبًا. يقرأ for await (const chunk of process.stdin) البيانات جزءًا جزءًا حتى تنتهي. اجمع الأجزاء، ثم قسّمها إلى أسطر.

// cat numbers.txt | node sum.js
let input = '';
for await (const chunk of process.stdin) {
    input += chunk;
}
const numbers = input.split('\n').filter((line) => line !== '').map(Number);
console.log(numbers.reduce((a, b) => a + b, 0));

هنا، يملأ مربع الإدخال في الطرفية stdin. ينتهي النص عادةً بحرف سطر جديد، لذا يكون السطر الأخير فارغًا: احذف الأسطر الفارغة.

challenge icon

التحدي

سهل

إدخال الملاحظات واحدة تلو الأخرى باستخدام add بطيء عندما تكون لديك قائمة جاهزة في مكان ما. أضف أمر import يقرأ عدة ملاحظات دفعة واحدة من مدخلات البرنامج، أي stdin.

  1. في notes.js، أضف أمر import. اقرأ محتوى stdin بالكامل في سلسلة نصية واحدة باستخدام for await، كما يوضح الدرس.
  2. قسّم النص إلى أسطر. أزل المسافات من بداية كل سطر ونهايته، وتجاوز الأسطر الفارغة بعد إزالة المسافات.
  3. أضف كل سطر متبقٍ كملاحظة باستخدام store.add، مع انتظار إتمام كل واحدة. سيظل المستمع added يطبع سطر Saved note لكل ملاحظة. وهذا متوقع.
  4. أخيرًا، اطبع Imported ، وعدد الملاحظات التي أُضيفت، و notes.. باستخدام هذا الإدخال:
    Buy bread
    Call the bank
    
    Water the plants
    يحفظ node notes.js import الأسطر الثلاثة كملاحظات. ويطبع ثلاثة أسطر Saved note، ثم في النهاية:
    Imported 3 notes.
    من دون أي إدخال، يطبع فقط:
    Imported 0 notes.

جرّب ذلك: انقر زر الإدخال بجوار «تشغيل». سيظهر مربع أسفل الوسائط. اكتب فيه ثلاثة أسطر، مع ترك سطر فارغ بين اثنين منها. اكتب import في المربع بعد $ node notes.js واضغط على Enter. ثم أفرغ مربع الإدخال وشغّل import مرة أخرى: ستظهر لك Imported 0 notes..

جرّب بنفسك

// تبدأ أداة ملاحظاتك هنا.
import { rmSync } from 'node:fs';
import path from 'node:path';
import { formatNote } from './format.js';
import stats from './legacy/stats.cjs';
import store from './store.js';

const [command, ...words] = process.argv.slice(2);
const text = words.join(' ');

store.on('added', (note, n) => {
    console.log(`Saved note ${n}.`);
});

const noteNumber = (word) => {
    const n = Number(word);
    if (!Number.isInteger(n) || n < 1 || n > store.notes.length) {
        console.error(`No note ${word}`);
        process.exit(1);
    }
    return n;
};

if (command === 'add') {
    await store.add(text);
} else if (command === 'list') {
    const owner = process.env.NOTES_OWNER ?? 'you';
    console.log(`Notes for ${owner}`);
    if (store.notes.length === 0) {
        console.log('No notes yet');
    }
    const lines = store.notes.map((note, i) => formatNote(i + 1, note));
    if (store.settings.sort === 'newest') {
        lines.reverse();
    }
    lines.forEach((line) => console.log(line));
} else if (command === 'where') {
    const file = path.join(process.cwd(), 'notes.json');
    console.log(file);
    console.log(path.basename(file));
} else if (command === 'stats') {
    console.log(`${store.notes.length} notes, ${stats.countWords(store.notes)} words`);
} else if (command === 'done') {
    const removed = await store.remove(noteNumber(words[0]));
    console.log(`Done: ${removed}`);
} else if (command === 'remind') {
    const note = store.notes[noteNumber(words[0]) - 1];
    let count = 3;
    const timer = setInterval(() => {
        if (count > 0) {
            console.log(count);
            count -= 1;
        } else {
            console.log(note);
            clearInterval(timer);
        }
    }, 200);
} else if (command === 'clear') {
    rmSync('notes.json', { force: true });
    console.log('Deleted notes.json');
} else {
    if (command) {
        console.error(`Unknown command: ${command}`);
    }
    console.error('Usage: node notes.js <command> [words]');
    process.exit(1);
}

جميع دروس أساسيات Node.js

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