Logo

Node.js – Načítanie vstupu od používateľa

Načítanie vstupu od používateľa je vec, ktorú človek takmer nikdy v praxi nepotrebuje robiť, ale keď sa učí programovať, tak sa s tým dosť často stretne. Je to proste fajn spôsob, ako nádejnemu programátorovi umožniť interagovať s počítačom. Načítanie vstupu však nie je takmer v žiadnom jazyku triviálna záležitosť a preto vždy, keď chcem načítavať vstup od používateľa musím proste googliť.

Javascript ako taký vôbec nebol určený na to, aby ho niekto spúštal v termináli a načítaval nejaký používateľov vstup (mimo browsera). Aj preto vznikol Node.js, ktorý sa používa na backende. Pomocou Node.js je však možné Javascript spustiť napr. aj v tvojom termináli a platí, že načítavanie vstupu v ňom nie je spravené úplne ideálne. Nechcem Node.js-u krivdiť, určite sú dôvody na to, prečo to nie je úplne jednoduché ako napr. v Pythone, ale to je možno na iný článok. Tu chcem len rýchlo ukázať, ako ten vstup teda načítať. Takto:

const readline = require('node:readline/promises')
const { stdin: input, stdout: output } = require('node:process')

const consoleInput = readline.createInterface({ input, output })

const readInputTest = async () => {
    const name = await consoleInput.question('Ako sa voláš? ')
    console.log(`Čau ${name}!`)

    consoleInput.close()
}

readInputTest()

Čo sa to tu deje? Toto je teda jednoduchý Node.js program, ktorý si od používateľa vypýta meno a potom ho pozdraví. Poďme si to rozkúskovať.

const readline = require('node:readline/promises')
const { stdin: input, stdout: output } = require('node:process')

Tieto dva riadky nám iba importnú libky, ktoré budeme potrebovať. Dosť mágia, ani to nerozoberajme. Nemá to zmysel.

const consoleInput = readline.createInterface({ input, output })

Toto je zase iba dáka mágia. Proste si nainicializujeme náš “načítavač” vstupu. Načítavač vstupu potrebuje vedieť, odkiaľ má načítavať – preto potrebujeme importovať aj stdin a stdout.

A čo tá naša funkcia teda?

const readInputTest = async () => {
    const name = await consoleInput.question('Ako sa voláš? ')
    console.log(`Čau ${name}!`)

    consoleInput.close()
}

readInputTest()

Tá musí byť async kvôli tomu, že pýtanie vstupu je asynchrónna operácia. Trošku ma to mrzí, ale nevadí, no big deal. Pre začiatočníka to však môže byť big deal, pretože už musí riešit async/await. Ale teda keď už to človek raz napíše, tak je to celkom okej. Vstup vypýtame pomocou funkcie question, ktorá bere ako parameter string, ktorý chceme userovi vypísať.

Dôležitý je posledný riadok v našej funkcii consoleInput.close(), bez ktorého by náš program nikdy neskončil, pretože by čakal na zavretie vstupu. Topka. Ďalšia vec, na ktorej sa začiatočníčka programátorka vie okašľat. Nevadí.

No a nakoniec iba zavoláme našu funkciu. Je len veľkým štastím, že tú našu funkciu nemusíme awaitovať, pretože potom by sa nám Node.js stažoval, že top-level await nie je povolený a museli by sme to riešiť. Preto je vlastne náš kód aj zabalený vo funkcii. Aby sme nemuseli riešiť top-level await. Mega. A to je všetko. Máme načítaný vstup. Easy.

Len pre zaujímavosť, tu je ekvivalent v Pythone:

name = input("Ako sa voláš?")
print(f"Čau {name}!")
Logo
Street of Code o.z.Hlaváčiková 2984105, Bratislava
Chcem odoberať novinky
Poskytnutím emailu súhlasíš s jeho spracovaním v súlade s GDPR.
Copyright © 2024 Street of Code
Kód tejto stránky si vieš pozrieť na našom GitHub-e