قراءة الإدخال
جزء من قسم أساسيات Node.js في رحلة Node.js على Coddy. الدرس 21 من 24.
إضافة الملاحظات أمرًا واحدًا في كل مرة بطيئة عندما تكون القائمة موجودة بالفعل في مكان آخر.
يمكن للبرنامج قراءة الإدخال من 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. ينتهي النص عادةً بمحرف سطر جديد، لذا يكون السطر الأخير فارغًا: احذف الأسطر الفارغة.
التحدي
سهل- يقرأ
node notes.js importالإدخال، ويحفظ ملاحظة واحدة لكل سطر، ويطبعImported 3 notes.. - يتم تخطي الأسطر الفارغة، وتُحذف المسافات المحيطة بالسطر.
اكتب ثلاثة أسطر في مربع الإدخال، مع ترك سطر فارغ بين سطرين منها، وشغّل node notes.js import. ثم شغّله والمربع فارغ.
جرّب بنفسك
// تبدأ أداة ملاحظاتك من هنا.
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);
}