使用Node.js中的相同响应对象发送多个响应

时间:2018-12-31 08:43:16

标签: node.js rest api http express

我的程序运行时间很长,需要以多次响应将数据发送回去。有什么方法可以通过express.js发回多个响应 我想在3秒钟后进行“测试”一个新的响应“栏”

app.get('/api', (req, res) => 
{
    res.write("test");
    setTimeout(function(){   
        res.write("bar"); 
        res.end();
    }, 3000);
});

res.write等待3050的响应时间开启

t

2 个答案:

答案 0 :(得分:1)

HTTP请求响应具有一对一映射。您可以返回一次HTTP响应,但是可以返回多长时间。有两种常用技术:

  1. Comet响应-由于Response是可写的流,因此可以在结束之前不时向其写入数据。确保在将接收此数据的客户端上正确配置了连接读取超时。

  2. 仅使用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