我的程序运行时间很长,需要以多次响应将数据发送回去。有什么方法可以通过express.js发回多个响应 我想在3秒钟后进行“测试”一个新的响应“栏”
app.get('/api', (req, res) =>
{
res.write("test");
setTimeout(function(){
res.write("bar");
res.end();
}, 3000);
});
res.write
等待3050的响应时间开启
答案 0 :(得分:1)
HTTP请求响应具有一对一映射。您可以返回一次HTTP响应,但是可以返回多长时间。有两种常用技术:
Comet响应-由于Response是可写的流,因此可以在结束之前不时向其写入数据。确保在将接收此数据的客户端上正确配置了连接读取超时。
仅使用Web套接字-这些是持久连接,允许服务器与客户端之间进行两种方式的消息传递。
答案 1 :(得分:0)
是的,您可以做到。您实际上需要了解的是 chunked transfer encoding 。
这是十年前使用的一种古老技术,自Websockets以来,我还没有看到任何人使用这种技术。
很显然,您只需要在不同的时间发送响应,也许某些事件以后会在块中触发。这实际上是express.js的默认响应类型。
但是有一个陷阱。当您尝试进行测试时,假设您使用的是现代浏览器或curl,它们都缓冲了块,因此您将看不到预期的结果。技巧是在发送连续的响应块之前填充块缓冲区。请参见下面的示例:
const express = require('express'),
app = express(),
port = 3011;
app.get('/', (req, res) => {
// res.write("Hello\n");
res.write("Hello" + " ".repeat(1024) + "\n");
setTimeout(() => {
res.write("World");
res.end();
}, 2000);
});
app.listen(port, () => console.log(`Listening on port ${port}!`));
前res.write
加上1024个空格会强制浏览器呈现块。然后,您第二个res.write
会按预期运行。您可以看到取消注释第一个res.write
的区别。
在网络级别上没有区别。实际上,即使在浏览器中,您也可以通过XHR Object(第一个AJAX实现)来实现。这是related answer