Menu
CoddyTech

Girdiyi Okuma

Coddy'nin Node.js Journey'sinin Node.js Temelleri bölümünün bir parçası. Ders 30 / 33.

Liste başka bir yerde zaten varsa, notları teker teker komutla eklemek yavaştır.

Bir program stdin'den de girdi okuyabilir: klavyede yazılan veya bir dosyadan gönderilen metin. Bir dizüstü bilgisayarda, cat numbers.txt | node sum.js bir dosyayı stdin'e gönderir; | işaretine pipe denir. for await (const chunk of process.stdin) metni sonuna ulaşana kadar parça parça okur. Parçaları birleştir, sonra satırlara ayır.

// 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));

Burada terminalin Input kutusu stdin'i doldurur. Metin genellikle satır sonu karakteriyle biter, bu yüzden son satır boştur: boş satırları kaldır.

challenge icon

Görev

Kolay

Bir listede zaten bulunan notları teker teker add komutuyla yazmak yavaştır. Programın girdisinden, yani stdin'den aynı anda birçok not okuyan bir import komutu ekle.

  1. notes.js dosyasına bir import komutu ekle. Derste gösterildiği gibi, for await kullanarak stdin'in tamamını tek bir dizeye oku.
  2. Metni satırlara böl. Her satırın başındaki ve sonundaki boşlukları sil ve bu işlemden sonra boş kalan satırları atla.
  3. Kalan her satırı bir not olarak store.add ile ekle ve her birinin tamamlanmasını bekle. added dinleyicin her not için bir Saved note satırı yazdırmaya devam eder. Bu beklenen bir durumdur.
  4. Son olarak Imported , eklenen not sayısını ve notes. yazdır. Şu girdiyle:
    Buy bread
    Call the bank
    
    Water the plants
    node notes.js import üç satırı not olarak kaydeder. Üç Saved note satırı yazdırır, ardından son olarak şunu yazdırır:
    Imported 3 notes.
    Hiç girdi olmadığında yalnızca şunu yazdırır:
    Imported 0 notes.

Deneyin: “Çalıştır” düğmesinin yanındaki “Girdi” düğmesine tıkla. Bağımsız değişkenlerin altında bir kutu açılır. Kutunun içine aralarında boş bir satır olacak şekilde üç satır yaz. $ node notes.js ifadesinden sonraki kutuya import yaz ve Enter'a bas. Ardından “Girdi” kutusunu boşaltıp import komutunu yeniden çalıştır: Imported 0 notes. çıktısını görürsün.

Kendin dene

// Not aracınız burada başlıyor.
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 Temelleri bölümündeki tüm dersler

Kendi başına pratik yap: Express playground