自定义Node.js REPL输入/输出流

4

我需要自定义REPL输入/输出流。例如,当发生某些事件时,我需要将一段脚本传递给REPL并获取其输出以及对其进行处理。


更清晰地描述一下,我正在开发一个 vscode插件 (github:源代码) ,它提供了REPL。在我的情况下,我有一个vscode WebView,我从中获取用户输入,然后想将该输入传递给node REPL,并获取其输出并向用户显示。

那么,我该如何实现呢?如果您需要更多信息,请告诉我。先谢谢了。

编辑1:

const replServer = repl.start({
    input: /* what should be here? */,
    output: /* what should be here? */
});

编辑2: 有人能解释一下上述示例中的input/output参数的用途吗?


你是如何解决这个问题的? - Kelvin Omereshone
@KelvinOmereshone 这个问题没有像我预期的那样解决,相反我创建了一个自定义虚拟机。请参见:https://stackoverflow.com/questions/67173347/javascript-do-all-evaluations-in-one-vm 和 https://dev59.com/scDqa4cB1Zd3GeqPe38g - MMD
有趣的是,我能够自己提供自定义流并且它也可以工作,但是范围的问题出现了,如果我在第一次运行中声明一个变量,即使退出并重新启动REPL后,该变量仍将被认为已经声明。 - Kelvin Omereshone
@KelvinOmereshone,你能否分享你的方法作为这个问题的答案?这将是非常有价值的。 - MMD
2个回答

3
这是我用过的一个解决方案。
const {
    PassThrough
} = require('stream')
const repl = require('repl')


const input = new PassThrough()
const output = new PassThrough()

output.setEncoding('utf-8')



const _repl = repl.start({
    prompt: 'awesomeRepl> ',
    input,
    output
})

_repl.on('exit', function() {
    // Do something when REPL exit
    console.log('Exited REPL...')
})


function evaluate(code) {
    let evaluatedCode = ''
    output.on('data', (chunk) => {
        evaluatedCode += chunk.toString()
        console.log(evaluatedCode)

    })

    input.write(`${code}\n`)
    return result

}

evaluate('2 + 2') // should return 4

注意,在evaluate函数外创建REPL实例,以便我们不会在每次调用evaluate时创建新实例。


评估”令人困惑且无效。那么,“结果”背后的理念是什么呢? - Mattwmaster58

1
要创建一个repl服务器,你只需要做以下操作:
  1. 编写以下代码:
const repl = require('repl')
repl.start({prompt: "> ", input: input_stream, output: output_stream");

提示符是一个字符串,用于提示输入流。 input_stream 需要是可读取的流,output_stream 需要是可写入的流。您可以在 这里 阅读有关流的更多信息。一旦流开始工作,您就可以执行以下操作:

output_stream.on('data', (chunk) => {                                                                                                                                                            
   14   //whatever you do with the data                                                                                                                                                                     
   15 });                

嗯……一切看起来都很好,但是有一个小问题:在文档中我看到了 getWritableStreamSomehow();。那么我应该如何创建一个流?而不是从某个地方获取它。 - MMD
然后如何将字符串传递给“可读流”。我的意思是像这样:readableStream.read(“hello world”)。然后repl应该解释它。 - MMD
我已经链接了节点文档,你应该能够在那里找到你需要的任何东西。 - 404galore
要创建一个可写流,请执行 const writable = new stream.Writable(); - 404galore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接