Skip to content

REPL

[안정됨: 2 - 안정됨]

안정됨: 2 안정성: 2 - 안정됨

소스 코드: lib/repl.js

node:repl 모듈은 독립형 프로그램으로 사용하거나 다른 응용 프로그램에 포함할 수 있는 REPL(Read-Eval-Print-Loop) 구현을 제공합니다. 다음과 같이 접근할 수 있습니다:

js
import repl from 'node:repl'
js
const repl = require('node:repl')

디자인 및 기능

node:repl 모듈은 repl.REPLServer 클래스를 내보냅니다. 실행 중인 동안 repl.REPLServer 인스턴스는 사용자 입력의 개별 라인을 수락하고 사용자 정의 평가 함수에 따라 평가한 다음 결과를 출력합니다. 입력과 출력은 각각 stdinstdout에서 올 수 있으며, Node.js 스트림에 연결될 수도 있습니다.

repl.REPLServer 인스턴스는 입력의 자동 완성, 완성 미리 보기, 단순한 Emacs 스타일의 줄 편집, 다중 줄 입력, ZSH와 유사한 역방향 i-검색, ZSH와 유사한 부분 문자열 기반 기록 검색, ANSI 스타일 출력, 현재 REPL 세션 상태 저장 및 복원, 오류 복구, 사용자 정의 가능한 평가 함수를 지원합니다. ANSI 스타일과 Emacs 스타일의 줄 편집을 지원하지 않는 터미널은 자동으로 제한된 기능 세트로 대체됩니다.

명령 및 특수 키

다음의 특수 명령은 모든 REPL 인스턴스에서 지원됩니다:

  • .break: 다중 줄 표현식을 입력하는 과정에서, .break 명령을 입력하거나 Ctrl+C를 눌러 해당 표현식의 추가 입력 또는 처리를 중단합니다.
  • .clear: REPL context를 빈 객체로 재설정하고 입력 중인 다중 줄 표현식을 지웁니다.
  • .exit: I/O 스트림을 닫아 REPL을 종료합니다.
  • .help: 특수 명령 목록을 표시합니다.
  • .save: 현재 REPL 세션을 파일에 저장합니다: > .save ./file/to/save.js
  • .load: 파일을 현재 REPL 세션으로 로드합니다. > .load ./file/to/load.js
  • .editor: 편집기 모드로 들어갑니다. (Ctrl+D를 눌러 완료, Ctrl+C를 눌러 취소)
bash
> .editor
// 편집기 모드 진입 (^D를 눌러 완료, ^C를 눌러 취소)
function welcome(name) {
  return `Hello ${name}!`;
}

welcome('Node.js User');

// ^D
'Hello Node.js User!'
>

REPL에서 다음 키 조합은 이러한 특수한 효과를 가집니다:

  • Ctrl+C: 한 번 누르면 .break 명령과 같은 효과를 가집니다. 빈 줄에서 두 번 누르면 .exit 명령과 같은 효과를 가집니다.
  • Ctrl+D: .exit 명령과 같은 효과를 가집니다.
  • Tab: 빈 줄에서 누르면 전역 및 로컬 (범위) 변수를 표시합니다. 다른 입력을 입력하는 동안 누르면 관련 자동 완성 옵션을 표시합니다.

역방향 i-검색과 관련된 키 바인딩은 reverse-i-search를 참조하세요. 다른 모든 키 바인딩은 TTY 키 바인딩을 참조하세요.

기본 평가

기본적으로, repl.REPLServer의 모든 인스턴스는 JavaScript 표현식을 평가하고 Node.js 내장 모듈에 액세스할 수 있는 평가 함수를 사용합니다. 이 기본 동작은 repl.REPLServer 인스턴스가 생성될 때 대체 평가 함수를 전달하여 재정의할 수 있습니다.

JavaScript 표현식

기본 평가기는 JavaScript 표현식의 직접 평가를 지원합니다.

bash
> 1 + 1
2
> const m = 2
undefined
> m + 1
3

블록 또는 함수 내에서 달리 범위가 지정되지 않는 한, 암시적으로 또는 const, let 또는 var 키워드를 사용하여 선언된 변수는 전역 범위에서 선언됩니다.

전역 및 지역 범위

기본 평가기는 전역 범위에 존재하는 모든 변수에 대한 액세스를 제공합니다. 각 REPLServer와 연결된 context 객체에 할당하여 REPL에 변수를 명시적으로 노출할 수 있습니다.

js
import repl from 'node:repl'
const msg = 'message'

repl.start('> ').context.m = msg
js
const repl = require('node:repl')
const msg = 'message'

repl.start('> ').context.m = msg

context 객체의 속성은 REPL 내에서 로컬로 나타납니다.

bash
$ node repl_test.js
> m
'message'

컨텍스트 속성은 기본적으로 읽기 전용이 아닙니다. 읽기 전용 전역 변수를 지정하려면 Object.defineProperty()를 사용하여 컨텍스트 속성을 정의해야 합니다.

js
import repl from 'node:repl'
const msg = 'message'

const r = repl.start('> ')
Object.defineProperty(r.context, 'm', {
  configurable: false,
  enumerable: true,
  value: msg,
})
js
const repl = require('node:repl')
const msg = 'message'

const r = repl.start('> ')
Object.defineProperty(r.context, 'm', {
  configurable: false,
  enumerable: true,
  value: msg,
})

코어 Node.js 모듈 액세스

기본 평가기는 사용 시 Node.js 코어 모듈을 REPL 환경에 자동으로 로드합니다. 예를 들어, 전역 또는 범위 지정 변수로 달리 선언하지 않는 한 입력 fsglobal.fs = require('node:fs')로 요청 시 평가됩니다.

bash
> fs.createReadStream('./some/file');

전역 포착되지 않은 예외

[기록]

버전변경 사항
v12.3.0이제 repl이 독립 실행형 프로그램으로 사용되는 경우 'uncaughtException' 이벤트가 트리거됩니다.

REPL은 해당 REPL 세션의 모든 포착되지 않은 예외를 포착하기 위해 domain 모듈을 사용합니다.

REPL에서 domain 모듈을 사용하는 경우 다음과 같은 부작용이 있습니다.

_(밑줄) 변수 할당

[기록]

버전변경 사항
v9.8.0_error 지원이 추가되었습니다.

기본 평가기는 기본적으로 가장 최근에 평가된 표현식의 결과를 특수 변수 _(밑줄)에 할당합니다. _를 명시적으로 값으로 설정하면 이 동작이 비활성화됩니다.

bash
> [ 'a', 'b', 'c' ]
[ 'a', 'b', 'c' ]
> _.length
3
> _ += 1
_에 대한 표현식 할당이 이제 비활성화되었습니다.
4
> 1 + 1
2
> _
4

마찬가지로, 오류가 있는 경우 _error는 마지막으로 본 오류를 참조합니다. _error를 명시적으로 값으로 설정하면 이 동작이 비활성화됩니다.

bash
> throw new Error('foo');
포착되지 않은 오류: foo
> _error.message
'foo'

await 키워드

최상위 수준에서 await 키워드에 대한 지원이 활성화되어 있습니다.

bash
> await Promise.resolve(123)
123
> await Promise.reject(new Error('REPL await'))
포착되지 않은 오류: REPL await
    at REPL2:1:54
> const timeout = util.promisify(setTimeout);
undefined
> const old = Date.now(); await timeout(1000); console.log(Date.now() - old);
1002
undefined

REPL에서 await 키워드를 사용하는 경우 알려진 제한 사항 중 하나는 constlet 키워드의 어휘 범위 지정이 무효화된다는 것입니다.

예를 들어 다음과 같습니다.

bash
> const m = await Promise.resolve(123)
undefined
> m
123
> const m = await Promise.resolve(234)
undefined
> m
234

--no-experimental-repl-await는 REPL에서 최상위 await을 비활성화해야 합니다.

추가됨: v13.6.0, v12.17.0

REPL은 ZSH와 유사한 양방향 역방향-i-검색을 지원합니다. +를 사용하여 뒤로 검색하고 +를 사용하여 앞으로 검색을 트리거합니다.

중복된 기록 항목은 건너뜁니다.

항목은 역방향 검색과 일치하지 않는 키가 눌리는 즉시 수락됩니다. 취소는 또는 +를 눌러 가능합니다.

방향을 변경하면 현재 위치에서 예상되는 방향으로 다음 항목을 즉시 검색합니다.

사용자 정의 평가 함수

새로운 repl.REPLServer가 생성되면 사용자 정의 평가 함수를 제공할 수 있습니다. 예를 들어 완전히 사용자 정의된 REPL 애플리케이션을 구현하는 데 사용할 수 있습니다.

다음은 주어진 숫자를 제곱하는 REPL의 예입니다.

js
import repl from 'node:repl'

function byThePowerOfTwo(number) {
  return number * number
}

function myEval(cmd, context, filename, callback) {
  callback(null, byThePowerOfTwo(cmd))
}

repl.start({ prompt: '숫자를 입력하세요: ', eval: myEval })
js
const repl = require('node:repl')

function byThePowerOfTwo(number) {
  return number * number
}

function myEval(cmd, context, filename, callback) {
  callback(null, byThePowerOfTwo(cmd))
}

repl.start({ prompt: '숫자를 입력하세요: ', eval: myEval })

복구 가능한 오류

REPL 프롬프트에서 를 누르면 현재 입력 줄이 eval 함수로 전송됩니다. 여러 줄 입력을 지원하기 위해 eval 함수는 제공된 콜백 함수에 repl.Recoverable의 인스턴스를 반환할 수 있습니다.

js
function myEval(cmd, context, filename, callback) {
  let result
  try {
    result = vm.runInThisContext(cmd)
  } catch (e) {
    if (isRecoverableError(e)) {
      return callback(new repl.Recoverable(e))
    }
  }
  callback(null, result)
}

function isRecoverableError(error) {
  if (error.name === 'SyntaxError') {
    return /^(Unexpected end of input|Unexpected token)/.test(error.message)
  }
  return false
}

REPL 출력 사용자 정의

기본적으로 repl.REPLServer 인스턴스는 제공된 Writable 스트림(process.stdout가 기본값)에 출력을 쓰기 전에 util.inspect() 메서드를 사용하여 출력을 포맷합니다. showProxy 검사 옵션은 기본적으로 true로 설정되어 있으며 colors 옵션은 REPL의 useColors 옵션에 따라 true로 설정됩니다.

useColors 부울 옵션은 생성 시 기본 작성기가 util.inspect() 메서드의 출력을 색상화하기 위해 ANSI 스타일 코드를 사용하도록 지시하기 위해 지정할 수 있습니다.

REPL이 독립 실행형 프로그램으로 실행되는 경우 REPL 내부에서 util.inspect()defaultOptions를 미러링하는 inspect.replDefaults 속성을 사용하여 REPL의 검사 기본값을 변경할 수도 있습니다.

bash
> util.inspect.replDefaults.compact = false;
false
> [1]
[
  1
]
>

repl.REPLServer 인스턴스의 출력을 완전히 사용자 정의하려면 생성 시 writer 옵션에 새 함수를 전달하세요. 예를 들어 다음 예제에서는 입력 텍스트를 대문자로 변환합니다.

js
import repl from 'node:repl'

const r = repl.start({ prompt: '> ', eval: myEval, writer: myWriter })

function myEval(cmd, context, filename, callback) {
  callback(null, cmd)
}

function myWriter(output) {
  return output.toUpperCase()
}
js
const repl = require('node:repl')

const r = repl.start({ prompt: '> ', eval: myEval, writer: myWriter })

function myEval(cmd, context, filename, callback) {
  callback(null, cmd)
}

function myWriter(output) {
  return output.toUpperCase()
}

클래스: REPLServer

추가된 버전: v0.1.91

repl.REPLServer 인스턴스는 repl.start() 메서드를 사용하거나 JavaScript new 키워드를 직접 사용하여 생성됩니다.

js
import repl from 'node:repl'

const options = { useColors: true }

const firstInstance = repl.start(options)
const secondInstance = new repl.REPLServer(options)
js
const repl = require('node:repl')

const options = { useColors: true }

const firstInstance = repl.start(options)
const secondInstance = new repl.REPLServer(options)

이벤트: 'exit'

추가된 버전: v0.7.7

'exit' 이벤트는 REPL이 .exit 명령어를 입력받거나, 사용자가 + 키를 두 번 눌러 SIGINT 신호를 보내거나, + 키를 눌러 입력 스트림에 'end' 신호를 보낼 때 발생합니다. 리스너 콜백은 인자 없이 호출됩니다.

js
replServer.on('exit', () => {
  console.log('repl에서 "exit" 이벤트 수신!')
  process.exit()
})

이벤트: 'reset'

추가된 버전: v0.11.0

'reset' 이벤트는 REPL의 컨텍스트가 재설정될 때 발생합니다. 이는 .clear 명령어가 입력으로 수신될 때마다 발생합니다. 단, REPL이 기본 평가자를 사용하고 repl.REPLServer 인스턴스가 useGlobal 옵션을 true로 설정하여 생성된 경우는 예외입니다. 리스너 콜백은 유일한 인자로 context 객체에 대한 참조와 함께 호출됩니다.

이는 주로 REPL 컨텍스트를 미리 정의된 상태로 다시 초기화하는 데 사용될 수 있습니다.

js
import repl from 'node:repl'

function initializeContext(context) {
  context.m = 'test'
}

const r = repl.start({ prompt: '> ' })
initializeContext(r.context)

r.on('reset', initializeContext)
js
const repl = require('node:repl')

function initializeContext(context) {
  context.m = 'test'
}

const r = repl.start({ prompt: '> ' })
initializeContext(r.context)

r.on('reset', initializeContext)

이 코드가 실행되면 전역 'm' 변수를 수정할 수 있지만, .clear 명령어를 사용하여 초기 값으로 재설정할 수 있습니다.

bash
$ ./node example.js
> m
'test'
> m = 1
1
> m
1
> .clear
Clearing context...
> m
'test'
>

replServer.defineCommand(keyword, cmd)

추가된 버전: v0.3.0

  • keyword <string> 명령어 키워드 (앞에 . 문자가 없는 형태).
  • cmd <Object> | <Function> 명령어가 처리될 때 호출할 함수.

replServer.defineCommand() 메서드는 REPL 인스턴스에 새로운 . 접두사 명령어를 추가하는 데 사용됩니다. 이러한 명령어는 . 다음에 keyword를 입력하여 호출됩니다. cmdFunction이거나 다음 속성을 가진 Object입니다.

  • help <string> .help가 입력될 때 표시할 도움말 텍스트 (선택 사항).
  • action <Function> 실행할 함수. 선택적으로 단일 문자열 인자를 허용합니다.

다음 예제는 REPL 인스턴스에 두 개의 새로운 명령어가 추가된 것을 보여줍니다.

js
import repl from 'node:repl'

const replServer = repl.start({ prompt: '> ' })
replServer.defineCommand('sayhello', {
  help: 'Say hello',
  action(name) {
    this.clearBufferedCommand()
    console.log(`Hello, ${name}!`)
    this.displayPrompt()
  },
})
replServer.defineCommand('saybye', function saybye() {
  console.log('Goodbye!')
  this.close()
})
js
const repl = require('node:repl')

const replServer = repl.start({ prompt: '> ' })
replServer.defineCommand('sayhello', {
  help: 'Say hello',
  action(name) {
    this.clearBufferedCommand()
    console.log(`Hello, ${name}!`)
    this.displayPrompt()
  },
})
replServer.defineCommand('saybye', function saybye() {
  console.log('Goodbye!')
  this.close()
})

새로운 명령어는 REPL 인스턴스 내에서 사용할 수 있습니다.

bash
> .sayhello Node.js User
Hello, Node.js User!
> .saybye
Goodbye!

replServer.displayPrompt([preserveCursor])

추가된 버전: v0.1.91

replServer.displayPrompt() 메서드는 REPL 인스턴스를 사용자의 입력을 받을 준비를 하고, 구성된 promptoutput의 새 줄에 출력하고 새로운 입력을 받기 위해 input을 재개합니다.

여러 줄의 입력을 입력하는 경우 'prompt' 대신 줄임표가 출력됩니다.

preserveCursortrue이면 커서 위치가 0으로 재설정되지 않습니다.

replServer.displayPrompt 메서드는 주로 replServer.defineCommand() 메서드를 사용하여 등록된 명령에 대한 작업 함수 내에서 호출되도록 의도되었습니다.

replServer.clearBufferedCommand()

추가된 버전: v9.0.0

replServer.clearBufferedCommand() 메서드는 버퍼링되었지만 아직 실행되지 않은 모든 명령을 지웁니다. 이 메서드는 주로 replServer.defineCommand() 메서드를 사용하여 등록된 명령에 대한 작업 함수 내에서 호출되도록 의도되었습니다.

replServer.setupHistory(historyPath, callback)

추가된 버전: v11.10.0

REPL 인스턴스에 대한 히스토리 로그 파일을 초기화합니다. Node.js 바이너리를 실행하고 명령줄 REPL을 사용할 때 히스토리 파일은 기본적으로 초기화됩니다. 그러나 프로그래밍 방식으로 REPL을 생성하는 경우에는 그렇지 않습니다. 프로그래밍 방식으로 REPL 인스턴스를 사용할 때 히스토리 로그 파일을 초기화하려면 이 메서드를 사용하세요.

repl.builtinModules

추가된 버전: v14.5.0

'http'와 같이 모든 Node.js 모듈 이름 목록입니다.

repl.start([options])

[History]

VersionChanges
v13.4.0, v12.17.0이제 preview 옵션을 사용할 수 있습니다.
v12.0.0terminal 옵션은 이제 모든 경우에 기본 설명을 따르고 useColors는 사용 가능한 경우 hasColors()를 확인합니다.
v10.0.0REPL_MAGIC_MODE replMode가 제거되었습니다.
v6.3.0이제 breakEvalOnSigint 옵션이 지원됩니다.
v5.8.0이제 options 매개변수는 선택 사항입니다.
v0.1.91추가됨: v0.1.91
  • options <Object> | <string>

    • prompt <string> 표시할 입력 프롬프트입니다. 기본값: '\> ' (뒤에 공백 포함).

    • input <stream.Readable> REPL 입력이 읽혀질 Readable 스트림입니다. 기본값: process.stdin.

    • output <stream.Writable> REPL 출력이 작성될 Writable 스트림입니다. 기본값: process.stdout.

    • terminal <boolean> true인 경우 output이 TTY 터미널로 처리되어야 함을 지정합니다. 기본값: 인스턴스화 시 output 스트림의 isTTY 속성 값을 확인합니다.

    • eval <Function> 주어진 각 입력 줄을 평가할 때 사용할 함수입니다. 기본값: JavaScript eval() 함수의 비동기 래퍼. eval 함수는 입력이 불완전하고 추가 줄을 묻는 프롬프트를 나타내기 위해 repl.Recoverable을 사용하여 오류를 발생시킬 수 있습니다.

    • useColors <boolean> true인 경우 기본 writer 함수가 REPL 출력에 ANSI 색상 스타일을 포함해야 함을 지정합니다. 사용자 정의 writer 함수가 제공되면 이것은 아무런 효과가 없습니다. 기본값: REPL 인스턴스의 terminal 값이 true인 경우 output 스트림에서 색상 지원을 확인합니다.

    • useGlobal <boolean> true인 경우 기본 평가 함수가 REPL 인스턴스에 대해 별도의 새 컨텍스트를 만드는 대신 JavaScript global을 컨텍스트로 사용함을 지정합니다. node CLI REPL은 이 값을 true로 설정합니다. 기본값: false.

    • ignoreUndefined <boolean> true인 경우 기본 writer가 undefined로 평가되는 경우 명령의 반환 값을 출력하지 않음을 지정합니다. 기본값: false.

    • writer <Function> output에 쓰기 전에 각 명령의 출력을 포맷하기 위해 호출하는 함수입니다. 기본값: util.inspect().

    • completer <Function> 사용자 정의 탭 자동 완성에 사용되는 선택적 함수입니다. 예시는 readline.InterfaceCompleter를 참조하세요.

    • replMode <symbol> 기본 평가자가 모든 JavaScript 명령을 엄격 모드 또는 기본 (sloppy) 모드에서 실행할지 여부를 지정하는 플래그입니다. 허용되는 값은 다음과 같습니다.

    • sloppy 모드에서 표현식을 평가하는 repl.REPL_MODE_SLOPPY.

    • 엄격 모드에서 표현식을 평가하는 repl.REPL_MODE_STRICT. 이는 모든 repl 문장에 'use strict'를 접두사로 붙이는 것과 같습니다.

    • breakEvalOnSigint <boolean> + 를 누르는 경우와 같이 SIGINT가 수신되면 현재 코드 조각의 평가를 중지합니다. 이는 사용자 정의 eval 함수와 함께 사용할 수 없습니다. 기본값: false.

    • preview <boolean> repl이 자동 완성 및 출력 미리보기를 인쇄할지 여부를 정의합니다. 기본값: 기본 eval 함수에서는 true이고 사용자 정의 eval 함수가 사용되는 경우 false입니다. terminal이 거짓이면 미리보기가 없으며 preview 값은 아무런 영향을 미치지 않습니다.

  • 반환값: <repl.REPLServer>

repl.start() 메서드는 repl.REPLServer 인스턴스를 생성하고 시작합니다.

options가 문자열인 경우 입력 프롬프트를 지정합니다.

js
import repl from 'node:repl'

// Unix 스타일 프롬프트
repl.start('$ ')
js
const repl = require('node:repl')

// Unix 스타일 프롬프트
repl.start('$ ')

Node.js REPL

Node.js 자체는 JavaScript를 실행하기 위한 대화형 인터페이스를 제공하기 위해 node:repl 모듈을 사용합니다. 이것은 인수를 전달하지 않고 Node.js 바이너리를 실행하거나 -i 인수를 전달하여 사용할 수 있습니다.

bash
$ node
> const a = [1, 2, 3];
undefined
> a
[ 1, 2, 3 ]
> a.forEach((v) => {
...   console.log(v);
...   });
1
2
3

환경 변수 옵션

다음 환경 변수를 사용하여 Node.js REPL의 다양한 동작을 사용자 정의할 수 있습니다.

  • NODE_REPL_HISTORY: 유효한 경로가 주어지면 영구 REPL 기록이 사용자의 홈 디렉터리에 있는 .node_repl_history 대신 지정된 파일에 저장됩니다. 이 값을 ''(빈 문자열)로 설정하면 영구 REPL 기록이 비활성화됩니다. 값에서 공백이 제거됩니다. Windows 플랫폼에서 값이 비어 있는 환경 변수는 유효하지 않으므로 이 변수를 하나 이상의 공백으로 설정하여 영구 REPL 기록을 비활성화하십시오.
  • NODE_REPL_HISTORY_SIZE: 기록을 사용할 수 있는 경우 유지할 기록 줄 수를 제어합니다. 양수여야 합니다. 기본값: 1000.
  • NODE_REPL_MODE: 'sloppy' 또는 'strict'일 수 있습니다. 기본값: 'sloppy'. 이는 엄격 모드가 아닌 코드를 실행할 수 있도록 허용합니다.

영구 기록

기본적으로 Node.js REPL은 사용자의 홈 디렉터리에 있는 .node_repl_history 파일에 입력을 저장하여 node REPL 세션 간에 기록을 유지합니다. 환경 변수 NODE_REPL_HISTORY=''를 설정하여 이를 비활성화할 수 있습니다.

고급 라인 편집기로 Node.js REPL 사용

고급 라인 편집기의 경우 환경 변수 NODE_NO_READLINE=1로 Node.js를 시작합니다. 그러면 기본 및 디버거 REPL이 표준 터미널 설정으로 시작되어 rlwrap과 함께 사용할 수 있습니다.

예를 들어 다음을 .bashrc 파일에 추가할 수 있습니다.

bash
alias node="env NODE_NO_READLINE=1 rlwrap node"

단일 실행 인스턴스에 대해 여러 REPL 인스턴스 시작

단일 global 객체를 공유하지만 별도의 I/O 인터페이스를 갖는 Node.js의 단일 실행 인스턴스에 대해 여러 REPL 인스턴스를 만들고 실행할 수 있습니다.

예를 들어 다음 예제에서는 stdin, Unix 소켓 및 TCP 소켓에 대해 별도의 REPL을 제공합니다.

js
import net from 'node:net'
import repl from 'node:repl'
import process from 'node:process'

let connections = 0

repl.start({
  prompt: 'Node.js via stdin> ',
  input: process.stdin,
  output: process.stdout,
})

net
  .createServer(socket => {
    connections += 1
    repl
      .start({
        prompt: 'Node.js via Unix socket> ',
        input: socket,
        output: socket,
      })
      .on('exit', () => {
        socket.end()
      })
  })
  .listen('/tmp/node-repl-sock')

net
  .createServer(socket => {
    connections += 1
    repl
      .start({
        prompt: 'Node.js via TCP socket> ',
        input: socket,
        output: socket,
      })
      .on('exit', () => {
        socket.end()
      })
  })
  .listen(5001)
js
const net = require('node:net')
const repl = require('node:repl')
let connections = 0

repl.start({
  prompt: 'Node.js via stdin> ',
  input: process.stdin,
  output: process.stdout,
})

net
  .createServer(socket => {
    connections += 1
    repl
      .start({
        prompt: 'Node.js via Unix socket> ',
        input: socket,
        output: socket,
      })
      .on('exit', () => {
        socket.end()
      })
  })
  .listen('/tmp/node-repl-sock')

net
  .createServer(socket => {
    connections += 1
    repl
      .start({
        prompt: 'Node.js via TCP socket> ',
        input: socket,
        output: socket,
      })
      .on('exit', () => {
        socket.end()
      })
  })
  .listen(5001)

명령줄에서 이 응용 프로그램을 실행하면 stdin에서 REPL이 시작됩니다. 다른 REPL 클라이언트는 Unix 소켓 또는 TCP 소켓을 통해 연결할 수 있습니다. 예를 들어 telnet은 TCP 소켓에 연결하는 데 유용하고 socat은 Unix 및 TCP 소켓에 모두 연결하는 데 사용할 수 있습니다.

stdin 대신 Unix 소켓 기반 서버에서 REPL을 시작하면 다시 시작하지 않고도 장기 실행 Node.js 프로세스에 연결할 수 있습니다.

net.Servernet.Socket 인스턴스를 통해 "완전한 기능"(터미널) REPL을 실행하는 예는 다음을 참조하십시오. https://gist.github.com/TooTallNate/2209310.

curl(1)을 통해 REPL 인스턴스를 실행하는 예는 다음을 참조하십시오. https://gist.github.com/TooTallNate/2053342.

이 예제는 Node.js REPL을 다양한 I/O 스트림을 사용하여 시작하는 방법을 보여주기 위한 순수 교육용입니다. 추가적인 보호 조치 없이 프로덕션 환경 또는 보안이 우려되는 상황에서 사용해서는 안 됩니다. 실제 응용 프로그램에서 REPL을 구현해야 하는 경우 보안 입력 메커니즘을 사용하고 개방형 네트워크 인터페이스를 피하는 것과 같은 이러한 위험을 완화하는 대체 접근 방식을 고려하십시오.