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

2016 年 8 月 12 日
 iahu

hi,大家好。

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

求帮忙。谢谢!

3146 次点击
所在节点    Node.js
9 条回复
bdbai
2016 年 8 月 12 日
你用了 jQuery 处理 ajax 请求吗?
这种场景适合用原生 XMLHTTPRequest 直接处理请求。我最近在做一个项目也用到了 chunked 实时回显文本,你可以参考一下:
https://github.com/bdbai/nthskeys-node/blob/master/app/apis/Extractor.js
magicdawn
2016 年 8 月 12 日
我之前碰到过, 试试设置 content-type: text/plain
然后拿 chrome 试试, 应该也跟浏览器有关系
gimp
2016 年 8 月 12 日
我用 socket.io 做过类似的东西, web 端输入网址,后台 ping ,然后实时返回给 web 页面展示。
我也不知道主流的是不是这么搞,反正是实现了类似的功能,仅供参考

https://github.com/sincerefly/online-ping-demo
smilekung
2016 年 8 月 12 日
@gimp 我也是用 websocket 搞得,不过是用来查 docker 的容器日志
Lxxyx
2016 年 8 月 14 日
@bdbai
高中生?很 6 啊,项目已 Star
bdbai
2016 年 8 月 14 日
@Lxxyx 多谢 star :)
iahu
2016 年 8 月 15 日
多谢大家的回复。
换成 webSocket 是可以的。
HTTP 设置`content-type: text/plain`没用,但是我也记得以前做过的项目设置后在 Chrome 下是有效的。
serial
2016 年 8 月 16 日
不要用 pipe , stdout 有行缓冲的,缓冲区满了行才会发出去。自己 write flush
Kei
2016 年 8 月 19 日
```
let child = shell.exec(command, {async: true}, function (err, stdout, stderr) {
cb(err, {err: stderr})
})
child.stdout.on('data', function (data) {
app.io.emit('output', {output: data})
})
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://study.congcong.us/t/298923

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX