【问题标题】:How to display Node.js REPL in a browser如何在浏览器中显示 Node.js REPL
【发布时间】:2019-09-03 15:45:36
【问题描述】:

我目前正在运行 Node.js repl 来评估代码,使用常规命令 repl.start const repl = Repl.start({ prompt }); 这将按预期启动控制台。 我希望从我的浏览器向服务器发送代码,以便对其进行评估并将其显示回浏览器中,但是没有找到任何这样做的文档。这可能吗?

【问题讨论】:

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


    【解决方案1】:

    这可能吗?

    是的,这也很危险,因为脚本可能需要一些文件系统实用程序并开始复制、删除或读取浏览器无法通过 Web 服务器访问的文件。

    话虽如此,假设您知道自己在问什么,这是一个如何实现类似目标的示例。

    为了简单起见,它使用套接字,但您可以使用 fetch 一次发送所有数据并接收输出结果。

    package.json

    {
      "name": "browser-repl",
      "main": "index.js",
      "dependencies": {
        "express": "^4.17.1",
        "pocket.io": "^0.1.4"
      }
    }
    

    index.html

    <!doctype html>
    <html>
      <head>
        <script src="/pocket.io/pocket.io.js"></script>
        <script>
        this.onload = () => {
          const socket = io();
          socket.on('eval', result => {
            repl.value += result;
          });
          sender.addEventListener('click', () => {
            const {value} = repl;
            repl.value = '';
            socket.emit('eval', value.trim() + '\n');
          });
        };
        </script>
      </head>
      <body>
        <textarea id="repl"></textarea>
        <button id="sender">evaluate</button>
      </body>
    </html>
    

    index.js

    const repl = require('repl');
    const app = require('express')();
    const http = require('http').Server(app);
    const io = require('pocket.io')(http);
    
    app.get('/', function(req, res){
      res.sendFile(__dirname + '/index.html');
    });
    
    io.on('connection', function(socket){
      let connected = true;
      const r = repl.start({
        writer(data) {
          if (connected)
            socket.emit('eval', data);
          return data;
        }
      });
      socket.on('eval', function (input) {
        r.input.emit('data', input);
      });
      socket.on('disconnect', function () {
        connected = false;
        r.input.emit('data', '.exit\n');
      });
    });
    
    http.listen(3000, function(){
      console.log('listening on *:3000');
    });
    

    您可以在包含 3 个文件的那个文件夹中 npm i,然后运行 ​​node .node index.js,然后转到 http://localhost:3000/

    请随意在 textarea 中输入1+1 或您喜欢的任何其他内容,然后按evaluate

    这显然是关于如何开始的提示,以便您的问题应该以某种方式得到回答。

    问候

    【讨论】:

    • 部分工作,但是当尝试评估多行时,它不会工作并以Unexpected end of input 退出。知道如何消化吗?
    猜你喜欢
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 2017-12-28
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多