我有一个长时间运行的进程,需要在多个响应中发回数据。有没有办法用 express.js 发回多个响应 我想在 3 秒后进行“测试”,一个新的响应“bar”
app.get('/api', (req, res) =>
{
res.write("test");
setTimeout(function(){
res.write("bar");
res.end();
}, 3000);
});
使用 res.write
等待 3050 的响应
最佳答案
是的,你可以做到。你需要知道的其实是 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/