【发布时间】:2019-09-03 15:45:36
【问题描述】:
我目前正在运行 Node.js repl 来评估代码,使用常规命令 repl.start const repl = Repl.start({ prompt });
这将按预期启动控制台。
我希望从我的浏览器向服务器发送代码,以便对其进行评估并将其显示回浏览器中,但是没有找到任何这样做的文档。这可能吗?
【问题讨论】:
标签: javascript node.js read-eval-print-loop
我目前正在运行 Node.js repl 来评估代码,使用常规命令 repl.start const repl = Repl.start({ prompt });
这将按预期启动控制台。
我希望从我的浏览器向服务器发送代码,以便对其进行评估并将其显示回浏览器中,但是没有找到任何这样做的文档。这可能吗?
【问题讨论】:
标签: javascript node.js read-eval-print-loop
这可能吗?
是的,这也很危险,因为脚本可能需要一些文件系统实用程序并开始复制、删除或读取浏览器无法通过 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 退出。知道如何消化吗?