REPL
소스 코드: lib/repl.js
node:repl
모듈은 독립형 프로그램으로 사용하거나 다른 응용 프로그램에 포함할 수 있는 REPL(Read-Eval-Print-Loop) 구현을 제공합니다. 다음과 같이 접근할 수 있습니다:
import repl from 'node:repl'
const repl = require('node:repl')
디자인 및 기능
node:repl
모듈은 repl.REPLServer
클래스를 내보냅니다. 실행 중인 동안 repl.REPLServer
인스턴스는 사용자 입력의 개별 라인을 수락하고 사용자 정의 평가 함수에 따라 평가한 다음 결과를 출력합니다. 입력과 출력은 각각 stdin
과 stdout
에서 올 수 있으며, Node.js 스트림에 연결될 수도 있습니다.
repl.REPLServer
인스턴스는 입력의 자동 완성, 완성 미리 보기, 단순한 Emacs 스타일의 줄 편집, 다중 줄 입력, ZSH와 유사한 역방향 i-검색, ZSH와 유사한 부분 문자열 기반 기록 검색, ANSI 스타일 출력, 현재 REPL 세션 상태 저장 및 복원, 오류 복구, 사용자 정의 가능한 평가 함수를 지원합니다. ANSI 스타일과 Emacs 스타일의 줄 편집을 지원하지 않는 터미널은 자동으로 제한된 기능 세트로 대체됩니다.
명령 및 특수 키
다음의 특수 명령은 모든 REPL 인스턴스에서 지원됩니다:
.break
: 다중 줄 표현식을 입력하는 과정에서,.break
명령을 입력하거나 Ctrl+C를 눌러 해당 표현식의 추가 입력 또는 처리를 중단합니다..clear
: REPLcontext
를 빈 객체로 재설정하고 입력 중인 다중 줄 표현식을 지웁니다..exit
: I/O 스트림을 닫아 REPL을 종료합니다..help
: 특수 명령 목록을 표시합니다..save
: 현재 REPL 세션을 파일에 저장합니다:> .save ./file/to/save.js
.load
: 파일을 현재 REPL 세션으로 로드합니다.> .load ./file/to/load.js
.editor
: 편집기 모드로 들어갑니다. (Ctrl+D를 눌러 완료, Ctrl+C를 눌러 취소)
> .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 표현식의 직접 평가를 지원합니다.
> 1 + 1
2
> const m = 2
undefined
> m + 1
3
블록 또는 함수 내에서 달리 범위가 지정되지 않는 한, 암시적으로 또는 const
, let
또는 var
키워드를 사용하여 선언된 변수는 전역 범위에서 선언됩니다.
전역 및 지역 범위
기본 평가기는 전역 범위에 존재하는 모든 변수에 대한 액세스를 제공합니다. 각 REPLServer
와 연결된 context
객체에 할당하여 REPL에 변수를 명시적으로 노출할 수 있습니다.
import repl from 'node:repl'
const msg = 'message'
repl.start('> ').context.m = msg
const repl = require('node:repl')
const msg = 'message'
repl.start('> ').context.m = msg
context
객체의 속성은 REPL 내에서 로컬로 나타납니다.
$ node repl_test.js
> m
'message'
컨텍스트 속성은 기본적으로 읽기 전용이 아닙니다. 읽기 전용 전역 변수를 지정하려면 Object.defineProperty()
를 사용하여 컨텍스트 속성을 정의해야 합니다.
import repl from 'node:repl'
const msg = 'message'
const r = repl.start('> ')
Object.defineProperty(r.context, 'm', {
configurable: false,
enumerable: true,
value: msg,
})
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 환경에 자동으로 로드합니다. 예를 들어, 전역 또는 범위 지정 변수로 달리 선언하지 않는 한 입력 fs
는 global.fs = require('node:fs')
로 요청 시 평가됩니다.
> fs.createReadStream('./some/file');
전역 포착되지 않은 예외
[기록]
버전 | 변경 사항 |
---|---|
v12.3.0 | 이제 repl이 독립 실행형 프로그램으로 사용되는 경우 'uncaughtException' 이벤트가 트리거됩니다. |
REPL은 해당 REPL 세션의 모든 포착되지 않은 예외를 포착하기 위해 domain
모듈을 사용합니다.
REPL에서 domain
모듈을 사용하는 경우 다음과 같은 부작용이 있습니다.
- 포착되지 않은 예외는 독립 실행형 REPL에서만
'uncaughtException'
이벤트를 발생시킵니다. 다른 Node.js 프로그램 내의 REPL에서 이 이벤트에 대한 리스너를 추가하면ERR_INVALID_REPL_INPUT
오류가 발생합니다. process.setUncaughtExceptionCaptureCallback()
을 사용하려고 하면ERR_DOMAIN_CANNOT_SET_UNCAUGHT_EXCEPTION_CAPTURE
오류가 발생합니다.
_
(밑줄) 변수 할당
[기록]
버전 | 변경 사항 |
---|---|
v9.8.0 | _error 지원이 추가되었습니다. |
기본 평가기는 기본적으로 가장 최근에 평가된 표현식의 결과를 특수 변수 _
(밑줄)에 할당합니다. _
를 명시적으로 값으로 설정하면 이 동작이 비활성화됩니다.
> [ 'a', 'b', 'c' ]
[ 'a', 'b', 'c' ]
> _.length
3
> _ += 1
_에 대한 표현식 할당이 이제 비활성화되었습니다.
4
> 1 + 1
2
> _
4
마찬가지로, 오류가 있는 경우 _error
는 마지막으로 본 오류를 참조합니다. _error
를 명시적으로 값으로 설정하면 이 동작이 비활성화됩니다.
> throw new Error('foo');
포착되지 않은 오류: foo
> _error.message
'foo'
await
키워드
최상위 수준에서 await
키워드에 대한 지원이 활성화되어 있습니다.
> 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
키워드를 사용하는 경우 알려진 제한 사항 중 하나는 const
및 let
키워드의 어휘 범위 지정이 무효화된다는 것입니다.
예를 들어 다음과 같습니다.
> const m = await Promise.resolve(123)
undefined
> m
123
> const m = await Promise.resolve(234)
undefined
> m
234
--no-experimental-repl-await
는 REPL에서 최상위 await을 비활성화해야 합니다.
역방향-i-검색
추가됨: v13.6.0, v12.17.0
REPL은 ZSH와 유사한 양방향 역방향-i-검색을 지원합니다. +를 사용하여 뒤로 검색하고 +를 사용하여 앞으로 검색을 트리거합니다.
중복된 기록 항목은 건너뜁니다.
항목은 역방향 검색과 일치하지 않는 키가 눌리는 즉시 수락됩니다. 취소는 또는 +를 눌러 가능합니다.
방향을 변경하면 현재 위치에서 예상되는 방향으로 다음 항목을 즉시 검색합니다.
사용자 정의 평가 함수
새로운 repl.REPLServer
가 생성되면 사용자 정의 평가 함수를 제공할 수 있습니다. 예를 들어 완전히 사용자 정의된 REPL 애플리케이션을 구현하는 데 사용할 수 있습니다.
다음은 주어진 숫자를 제곱하는 REPL의 예입니다.
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 })
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
의 인스턴스를 반환할 수 있습니다.
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의 검사 기본값을 변경할 수도 있습니다.
> util.inspect.replDefaults.compact = false;
false
> [1]
[
1
]
>
repl.REPLServer
인스턴스의 출력을 완전히 사용자 정의하려면 생성 시 writer
옵션에 새 함수를 전달하세요. 예를 들어 다음 예제에서는 입력 텍스트를 대문자로 변환합니다.
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()
}
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
options
<Object> | <string>repl.start()
참조- 확장: <readline.Interface>
repl.REPLServer
인스턴스는 repl.start()
메서드를 사용하거나 JavaScript new
키워드를 직접 사용하여 생성됩니다.
import repl from 'node:repl'
const options = { useColors: true }
const firstInstance = repl.start(options)
const secondInstance = new repl.REPLServer(options)
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'
신호를 보낼 때 발생합니다. 리스너 콜백은 인자 없이 호출됩니다.
replServer.on('exit', () => {
console.log('repl에서 "exit" 이벤트 수신!')
process.exit()
})
이벤트: 'reset'
추가된 버전: v0.11.0
'reset'
이벤트는 REPL의 컨텍스트가 재설정될 때 발생합니다. 이는 .clear
명령어가 입력으로 수신될 때마다 발생합니다. 단, REPL이 기본 평가자를 사용하고 repl.REPLServer
인스턴스가 useGlobal
옵션을 true
로 설정하여 생성된 경우는 예외입니다. 리스너 콜백은 유일한 인자로 context
객체에 대한 참조와 함께 호출됩니다.
이는 주로 REPL 컨텍스트를 미리 정의된 상태로 다시 초기화하는 데 사용될 수 있습니다.
import repl from 'node:repl'
function initializeContext(context) {
context.m = 'test'
}
const r = repl.start({ prompt: '> ' })
initializeContext(r.context)
r.on('reset', initializeContext)
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
명령어를 사용하여 초기 값으로 재설정할 수 있습니다.
$ ./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
를 입력하여 호출됩니다. cmd
는 Function
이거나 다음 속성을 가진 Object
입니다.
help
<string>.help
가 입력될 때 표시할 도움말 텍스트 (선택 사항).action
<Function> 실행할 함수. 선택적으로 단일 문자열 인자를 허용합니다.
다음 예제는 REPL 인스턴스에 두 개의 새로운 명령어가 추가된 것을 보여줍니다.
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()
})
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 인스턴스 내에서 사용할 수 있습니다.
> .sayhello Node.js User
Hello, Node.js User!
> .saybye
Goodbye!
replServer.displayPrompt([preserveCursor])
추가된 버전: v0.1.91
preserveCursor
<boolean>
replServer.displayPrompt()
메서드는 REPL 인스턴스를 사용자의 입력을 받을 준비를 하고, 구성된 prompt
를 output
의 새 줄에 출력하고 새로운 입력을 받기 위해 input
을 재개합니다.
여러 줄의 입력을 입력하는 경우 'prompt' 대신 줄임표가 출력됩니다.
preserveCursor
가 true
이면 커서 위치가 0
으로 재설정되지 않습니다.
replServer.displayPrompt
메서드는 주로 replServer.defineCommand()
메서드를 사용하여 등록된 명령에 대한 작업 함수 내에서 호출되도록 의도되었습니다.
replServer.clearBufferedCommand()
추가된 버전: v9.0.0
replServer.clearBufferedCommand()
메서드는 버퍼링되었지만 아직 실행되지 않은 모든 명령을 지웁니다. 이 메서드는 주로 replServer.defineCommand()
메서드를 사용하여 등록된 명령에 대한 작업 함수 내에서 호출되도록 의도되었습니다.
replServer.setupHistory(historyPath, callback)
추가된 버전: v11.10.0
historyPath
<string> 히스토리 파일의 경로callback
<Function> 히스토리 쓰기가 준비되거나 오류 발생 시 호출됩니다.err
<Error>repl
<repl.REPLServer>
REPL 인스턴스에 대한 히스토리 로그 파일을 초기화합니다. Node.js 바이너리를 실행하고 명령줄 REPL을 사용할 때 히스토리 파일은 기본적으로 초기화됩니다. 그러나 프로그래밍 방식으로 REPL을 생성하는 경우에는 그렇지 않습니다. 프로그래밍 방식으로 REPL 인스턴스를 사용할 때 히스토리 로그 파일을 초기화하려면 이 메서드를 사용하세요.
repl.builtinModules
추가된 버전: v14.5.0
'http'
와 같이 모든 Node.js 모듈 이름 목록입니다.
repl.start([options])
[History]
Version | Changes |
---|---|
v13.4.0, v12.17.0 | 이제 preview 옵션을 사용할 수 있습니다. |
v12.0.0 | terminal 옵션은 이제 모든 경우에 기본 설명을 따르고 useColors 는 사용 가능한 경우 hasColors() 를 확인합니다. |
v10.0.0 | REPL_MAGIC_MODE replMode 가 제거되었습니다. |
v6.3.0 | 이제 breakEvalOnSigint 옵션이 지원됩니다. |
v5.8.0 | 이제 options 매개변수는 선택 사항입니다. |
v0.1.91 | 추가됨: v0.1.91 |
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> 주어진 각 입력 줄을 평가할 때 사용할 함수입니다. 기본값: JavaScripteval()
함수의 비동기 래퍼.eval
함수는 입력이 불완전하고 추가 줄을 묻는 프롬프트를 나타내기 위해repl.Recoverable
을 사용하여 오류를 발생시킬 수 있습니다.useColors
<boolean>true
인 경우 기본writer
함수가 REPL 출력에 ANSI 색상 스타일을 포함해야 함을 지정합니다. 사용자 정의writer
함수가 제공되면 이것은 아무런 효과가 없습니다. 기본값: REPL 인스턴스의terminal
값이true
인 경우output
스트림에서 색상 지원을 확인합니다.useGlobal
<boolean>true
인 경우 기본 평가 함수가 REPL 인스턴스에 대해 별도의 새 컨텍스트를 만드는 대신 JavaScriptglobal
을 컨텍스트로 사용함을 지정합니다. 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
가 문자열인 경우 입력 프롬프트를 지정합니다.
import repl from 'node:repl'
// Unix 스타일 프롬프트
repl.start('$ ')
const repl = require('node:repl')
// Unix 스타일 프롬프트
repl.start('$ ')
Node.js REPL
Node.js 자체는 JavaScript를 실행하기 위한 대화형 인터페이스를 제공하기 위해 node:repl
모듈을 사용합니다. 이것은 인수를 전달하지 않고 Node.js 바이너리를 실행하거나 -i
인수를 전달하여 사용할 수 있습니다.
$ 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
파일에 추가할 수 있습니다.
alias node="env NODE_NO_READLINE=1 rlwrap node"
단일 실행 인스턴스에 대해 여러 REPL 인스턴스 시작
단일 global
객체를 공유하지만 별도의 I/O 인터페이스를 갖는 Node.js의 단일 실행 인스턴스에 대해 여러 REPL 인스턴스를 만들고 실행할 수 있습니다.
예를 들어 다음 예제에서는 stdin
, Unix 소켓 및 TCP 소켓에 대해 별도의 REPL을 제공합니다.
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)
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.Server
및 net.Socket
인스턴스를 통해 "완전한 기능"(터미널) REPL을 실행하는 예는 다음을 참조하십시오. https://gist.github.com/TooTallNate/2209310.
curl(1)
을 통해 REPL 인스턴스를 실행하는 예는 다음을 참조하십시오. https://gist.github.com/TooTallNate/2053342.
이 예제는 Node.js REPL을 다양한 I/O 스트림을 사용하여 시작하는 방법을 보여주기 위한 순수 교육용입니다. 추가적인 보호 조치 없이 프로덕션 환경 또는 보안이 우려되는 상황에서 사용해서는 안 됩니다. 실제 응용 프로그램에서 REPL을 구현해야 하는 경우 보안 입력 메커니즘을 사용하고 개방형 네트워크 인터페이스를 피하는 것과 같은 이러한 위험을 완화하는 대체 접근 방식을 고려하십시오.