Nodejs:把 shell 的输出 pipe 到 http.response 上后,怎么才能即时的把输出即时显示到浏览器上?
Nodejs:把 shell 的输出 pipe 到 http.response 上后,怎么才能即时的把输出即时显示到浏览器上?
hi,大家好。
问一个 http 的问题。我用 node.js 把 shell 的 stdout pipe 到 http.response 上了,设置了 chunked ,但是页面要卡一段很长的时间(经常是要等后台的输出全完了)才显示。我希望能边刷 shell 输出,边在浏览器上页面 shell 的输出。
求帮忙。谢谢!
你用了 jQuery 处理 ajax 请求吗?
这种场景适合用原生 XMLHTTPRequest 直接处理请求。我最近在做一个项目也用到了 chunked 实时回显文本,你可以参考一下:
https://github.com/bdbai/nthskeys-node/blob/master/app/apis/Extractor.js
我之前碰到过, 试试设置 content-type: text/plain
然后拿 chrome 试试, 应该也跟浏览器有关系
我用 socket.io 做过类似的东西, web 端输入网址,后台 ping ,然后实时返回给 web 页面展示。
我也不知道主流的是不是这么搞,反正是实现了类似的功能,仅供参考
https://github.com/sincerefly/online-ping-demo
我也是用 websocket 搞得,不过是用来查 docker 的容器日志
高中生?很 6 啊,项目已 Star
多谢 star :)
多谢大家的回复。
换成 webSocket 是可以的。
HTTP 设置content-type: text/plain
没用,但是我也记得以前做过的项目设置后在 Chrome 下是有效的。
不要用 pipe , stdout 有行缓冲的,缓冲区满了行才会发出去。自己 write flush
<br> let child = shell.exec(command, {async: true}, function (err, stdout, stderr) {<br> cb(err, {err: stderr})<br> })<br> child.stdout.on('data', function (data) {<br> app.io.emit('output', {output: data})<br> })<br>
在 Node.js 中,要实现将 shell 命令的输出即时通过 HTTP 响应传输到浏览器,可以使用流(stream)来处理。以下是一个示例代码,展示了如何实现这个功能:
const http = require('http');
const { exec } = require('child_process');
const server = http.createServer((req, res) => {
// 设置响应头
res.writeHead(200, { 'Content-Type': 'text/plain' });
// 执行 shell 命令并获取输出流
const command = 'your-shell-command-here'; // 替换为你需要执行的命令
const shell = exec(command, { encoding: 'utf8' });
// 监听 shell 输出的数据并即时写入响应
shell.stdout.on('data', (data) => {
res.write(data);
});
// 监听错误并结束响应
shell.on('error', (error) => {
res.end(`Error: ${error.message}`);
});
// 监听 shell 退出并结束响应
shell.on('close', (code) => {
res.end(`Shell command exited with code ${code}`);
});
});
server.listen(3000, () => {
console.log('Server is running on http://localhost:3000');
});
在这个示例中,我们创建了一个 HTTP 服务器,监听 3000
端口。当接收到请求时,执行一个 shell 命令,并通过监听 stdout
的 data
事件即时将输出写入 HTTP 响应。同时,我们还处理了错误和命令退出事件,以确保响应能够正确结束。
请确保将 your-shell-command-here
替换为你实际需要执行的 shell 命令。