Nodejs:把 shell 的输出 pipe 到 http.response 上后,怎么才能即时的把输出即时显示到浏览器上?

发布于 1周前 作者 sinazl 来自 nodejs/Nestjs

Nodejs:把 shell 的输出 pipe 到 http.response 上后,怎么才能即时的把输出即时显示到浏览器上?

hi,大家好。

问一个 http 的问题。我用 node.js 把 shell 的 stdout pipe 到 http.response 上了,设置了 chunked ,但是页面要卡一段很长的时间(经常是要等后台的输出全完了)才显示。我希望能边刷 shell 输出,边在浏览器上页面 shell 的输出。

求帮忙。谢谢!

10 回复

你用了 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

多谢大家的回复。
换成 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 命令,并通过监听 stdoutdata 事件即时将输出写入 HTTP 响应。同时,我们还处理了错误和命令退出事件,以确保响应能够正确结束。

请确保将 your-shell-command-here 替换为你实际需要执行的 shell 命令。

回到顶部