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

2016-08-12 17:25:53 +08:00
 iahu

hi,大家好。

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

求帮忙。谢谢!

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

https://github.com/sincerefly/online-ping-demo
smilekung
2016-08-12 22:53:31 +08:00
@gimp 我也是用 websocket 搞得,不过是用来查 docker 的容器日志
Lxxyx
2016-08-14 13:52:34 +08:00
@bdbai
高中生?很 6 啊,项目已 Star
bdbai
2016-08-14 14:05:40 +08:00
@Lxxyx 多谢 star :)
iahu
2016-08-15 16:27:25 +08:00
多谢大家的回复。
换成 webSocket 是可以的。
HTTP 设置`content-type: text/plain`没用,但是我也记得以前做过的项目设置后在 Chrome 下是有效的。
serial
2016-08-16 13:13:25 +08:00
不要用 pipe , stdout 有行缓冲的,缓冲区满了行才会发出去。自己 write flush
Kei
2016-08-19 14:23:51 +08:00
```
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://www.v2ex.com/t/298923

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

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

© 2021 V2EX