프로그래밍 언어/NODE JS

간단한 콘솔 명령어 만들기(3)

· 코딩마이데이

이번에는 사용자로부터 입력을 받아봅시다. 노드의 내장 모듈인 readline을 사용합니다.

index.js

#!/usr/bin/env node
const readline = require("readline");

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

rl.question("예제가 재미있읍니까? (y/n) ", (answer) => {
  if (answer === "y") {
    console.log("감사합니다!");
  } else if (answer === "n") {
    console.log("죄송합니다!");
  } else {
    console.log("y 또는 n만 입력하세요.");
  }
  rl.close();
});

 

readline 모듈을 불러와서 createInterface 메서드로 ri 객체를 생성합니다. 인수로 설정 객체를 제공했는데요. input 속성에는 process.stdin을, output 속성에는 process.stdout을 넣었습니다.

process.stdin과 process.stdout은 각각 콘솔 입력과 출력을 담당하는 스트림입니다. readline 모듈은 이들을 사용해서 사용자로부터 입력을 받고, 그에 따른 결과를 출력합니다.

ci 객체의 question 메서드의 첫 번째 인수가 질문 내용입니다. 두 번째로 인수로 받는 콜백 함수는 매개변수로 답변(answer)을 가지고 있습니다. 예제와 같이 answer를 사용해 사용자의 답변을 받아서 프로그램의 다음 동작을 정할 수 있습니다. 입출력 과정이 다 끝나면 close 메서드로 question 메서드를 종료합니다. 

$ cli
예제가 재미있읍니까? (y/n) y
감사합니다!

 

위의 예제에서 y나 n을 입력하지 않을 경우 콘솔에 'y 또는 n만 입력하세요.'라는 메시지가 뜨고 프로그램이 종료됩니다. 이떼 프로그램이 종료되는 대신 기존 콘솔을 모두 지우고 다시 입력받게 하고 싶을 수도 있을 텐데요. 콘솔 내용을 지우려면 console.clear

메서드를 호출하면 됩니다. 이 메서드를 사용해서 위의 코드를 리팩토링해보겠습니다.

 

index.js

#!/usr/bin/env node
const readline = require("readline");

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

console.clear();
const answerCallback = (answer) => {
  if (answer === "y") {
    console.log("감사합니다!");
    rl.close();
  } else if (answer === "n") {
    console.log("죄송합니다!");
    rl.close();
  } else {
    console.clear();
    console.log("y 또는 n만 입력하세요.");
    rl.question("예제가 제미있습니까? (y/n) ", answerCallback);
  }
};

rl.question("예제가 재미있습니까? (y/n) ", answerCallback);

 

$ cli