REPL服务器的客户端无法正确显示服务器的输入和输出

时间:2016-01-30 03:03:12

标签: node.js stdin read-eval-print-loop

我写了一个小的REPL服务器和客户端来调试我正在编写的应用程序。当我输入足够的文本以使其包裹到终端中的下一行然后按退格键时,它将显示所有行,而不仅仅是更新的行。一旦我不再删除任何字符,我也无法返回上一行。如果节点合理理智,必须有一种方法可以做到这一点,但我完全不知道要改变什么。我怎样才能做到这一点?

编辑:选项卡完成在点击输入后才显示。历史记录中的行根本不会显示在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');
}

1 个答案:

答案 0 :(得分:0)

我设法通过小太郎的帮助和向repl-server.js添加readable事件处理程序来解决这个问题:

socket.on('readable', (chunk) => {
    socket.read(chunk);
});