REPL 服务器的客户端无法正确显示服务器的输入和输出
Clients for a REPL server do not display the server's input and output properly
我编写了一个小型 REPL 服务器和客户端来调试我正在编写的应用程序。当我输入足够多的文本使其换行到终端中的下一行并按退格键时,它将显示所有行,而不仅仅是更新的行。一旦我不再有任何字符要删除,我也无法返回到前几行。如果节点相当理智,就必须有办法做到这一点,但我完全不知道要改变什么。我怎样才能使这项工作?
编辑:tab complete 在按下 enter 之前不会显示。历史记录中的行根本不会显示在 process.stdin
中,但在发送后仍会进行评估
repl-client.js
'use strict';
const net = require('net');
const socket = net.connect(8001, '0.0.0.0');
process.stdin.pipe(socket);
socket.pipe(process.stdout);
process.stdin.on('finish', () => {
socket.destroy('');
});
repl-server.js
import * as babel from 'babel-core';
import net from 'net';
import repl from 'repl';
import vm from 'vm';
function extendContext(context) {
// add vars I need to context
return context;
}
function babelEval(input, filename) {
let sanitizedInput = (input.startsWith('(') && input.endsWith(')'))
? input.slice(1, -1)
: input;
let code = babel.transform(sanitizedInput).code;
return vm.runInThisContext(code, {filename});
}
export default function createREPLServer(port, hostname) {
return net.createServer((socket) => {
const _repl = repl.start({
prompt: 'test> ',
input: socket,
output: socket,
terminal: true,
useColors: true,
useGlobal: true,
replMode: repl.REPL_MODE_STRICT,
eval(input, context, filename, cb) {
let err;
let code;
try {
code = babelEval(input.trim(), filename);
} catch (e) {
err = e;
}
cb(err, code);
}
});
_repl.on('reset', (context) => extendContext(context));
_repl.on('exit', () => socket.end());
extendContext(_repl.context);
}).listen(8001, '0.0.0.0');
}
在 小太郎 的帮助下,我通过向 repl-server.js:
添加一个 readable
事件处理程序,设法部分解决了这个问题
socket.on('readable', (chunk) => {
socket.read(chunk);
});
我编写了一个小型 REPL 服务器和客户端来调试我正在编写的应用程序。当我输入足够多的文本使其换行到终端中的下一行并按退格键时,它将显示所有行,而不仅仅是更新的行。一旦我不再有任何字符要删除,我也无法返回到前几行。如果节点相当理智,就必须有办法做到这一点,但我完全不知道要改变什么。我怎样才能使这项工作?
编辑:tab complete 在按下 enter 之前不会显示。历史记录中的行根本不会显示在 process.stdin
中,但在发送后仍会进行评估
repl-client.js
'use strict';
const net = require('net');
const socket = net.connect(8001, '0.0.0.0');
process.stdin.pipe(socket);
socket.pipe(process.stdout);
process.stdin.on('finish', () => {
socket.destroy('');
});
repl-server.js
import * as babel from 'babel-core';
import net from 'net';
import repl from 'repl';
import vm from 'vm';
function extendContext(context) {
// add vars I need to context
return context;
}
function babelEval(input, filename) {
let sanitizedInput = (input.startsWith('(') && input.endsWith(')'))
? input.slice(1, -1)
: input;
let code = babel.transform(sanitizedInput).code;
return vm.runInThisContext(code, {filename});
}
export default function createREPLServer(port, hostname) {
return net.createServer((socket) => {
const _repl = repl.start({
prompt: 'test> ',
input: socket,
output: socket,
terminal: true,
useColors: true,
useGlobal: true,
replMode: repl.REPL_MODE_STRICT,
eval(input, context, filename, cb) {
let err;
let code;
try {
code = babelEval(input.trim(), filename);
} catch (e) {
err = e;
}
cb(err, code);
}
});
_repl.on('reset', (context) => extendContext(context));
_repl.on('exit', () => socket.end());
extendContext(_repl.context);
}).listen(8001, '0.0.0.0');
}
在 小太郎 的帮助下,我通过向 repl-server.js:
添加一个readable
事件处理程序,设法部分解决了这个问题
socket.on('readable', (chunk) => {
socket.read(chunk);
});