node.js - 在nodejs中发送具有相同响应对象的多个响应

标签 node.js rest api http express

我有一个长时间运行的进程,需要在多个响应中发回数据。有没有办法用 express.js 发回多个响应 我想在 3 秒后进行“测试”,一个新的响应“bar”

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

使用 res.write 等待 3050 的响应

t

最佳答案

是的,你可以做到。你需要知道的其实是 chunked transfer encoding

这是十年前使用的旧技术之一,自从 Websockets 以来,我还没有看到有人使用它。

显然,您只需要在不同的时间发送响应,也许稍后会在 chunks 中触发某些事件。这实际上是 express.js 的默认响应类型。

但有一个问题。当您尝试对此进行测试时,假设您使用的是现代浏览器或 curl,它们都缓冲 block ,因此您不会看到预期的结果。技巧是在发送连续响应 block 之前填充 block 缓冲区。请看下面的例子:

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 个空格会强制浏览器渲染 block 。然后你第二个 res.write 的行为如你所料。您可以看到取消注释第一个 res.write 的区别。

在网络层面没有区别。实际上,即使在浏览器中,您也可以通过 XHR 对象(第一个 AJAX 实现)来实现这一点这里是 related answer

关于node.js - 在nodejs中发送具有相同响应对象的多个响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53985333/

相关文章:

javascript - 如何在 Express JS 中使用 router.post 使 POST 工作

java - 使用 Jersey 从 MongoDb 发送 Json 响应

java - 使用 Spring Security for REST API 进行基本身份验证中的用户权限

java - 仅当方法使用 xml/json 时才需要 JAXB 元素

java - Android Volley解析Json响应为null

ajax - 显示在服务器端运行的长进程的状态

node.js - 本地主机上的 Passport 谷歌oauth

javascript - 如何构建我的 nodejs 代码?胖模型/瘦 Controller

api - 通过 HTTP 从纪元获取毫秒数

api - 使用 Active Collab 5 API 进行跨项目时间记录过滤