如何在代码执行期间多次发送响应而不在最后一次发送所有响应

  • 本文关键字:响应 最后一次 代码 执行期 node.js
  • 更新时间 :
  • 英文 :


你好,我一直在试图找出这一点,因为一段时间,但我无法找到一个解决方案,它在node.js

我通常用Python编写代码,我能够使用生成器动态更新API

@app.route("/api/login")
def getQR():
def generate_output():
time.sleep(3)
yield render_template_string(f"Hello 1n")
time.sleep(10)
yield render_template_string(f"Hello 2n")
return Response(stream_with_context(generate_output()))

上面的代码发送第一个响应"Hello 1"3秒后再等10秒,加上"你好2";回复。我试图在Node.js中重建这一点,但无法弄清楚如何做到这一点。下面是我当前的代码:

const server = http.createServer((req, res) => {
if (req.url == "/" || req.url == "") {
res.write("Hello 1n");
// Some code execution for 10s
res.write("Hello 2n")
res.end();
}
});

上面的代码等待10秒,然后发送"Hello 1nHello 2n"我基本上是在尝试用生成器实现我在Python代码中可以做的事情。任何变通/解决方案或建议将不胜感激。谢谢你!

使用python流式传输内容

根据python文档,生成器表示数据流:

有时候你想发送一个大量的数据对于客户端来说,要比您想要保存在内存中的要多得多。但是,在动态生成数据时,如何将数据发送回客户机,而不需要往返于文件系统?

答案是使用生成器和直接回应。

检查这些引用:

  • http://matrix.umcs.lublin.pl/DOC/python-flask-doc/html/patterns/streaming.html
  • 如何检测stream_with_context在Flask中被用户中止?
  • https://www.kite.com/python/docs/flask.stream_with_context

使用nodejs流式传输内容

理解你需要的是数据流到你的浏览器进行大文件传输,而不是经典的res.send("hello"),基本上流程是:

  • 为文件创建流,不为字符串创建流
  • 管道或将其写入响应
  • 结束交换

示例:

import {createReadStream} from 'fs';
import express from 'express';
const app = express();
app.get('/', (req, res) => {
var readStream = createReadStream('./data.txt');
readStream.on('data', (data) => {
res.write(data);
});
readStream.on('end', (data) => {
res.status(200).send();
});
});
app.listen(3000);

检查这些引用:

  • https://nodejs.dev/learn/nodejs-streams
  • https://medium.com/developers-arena/streams-piping-and-their-error-handling-in-nodejs-c3fd818530b6
  • https://nodesource.com/blog/understanding-streams-in-nodejs/
  • https://nodesource.com/blog/understanding-streams-in-nodejs/
  • https://dzone.com/articles/streaming-data-using-nodejs
  • 将node/express中的文件流式传输到客户端
  • 如何在express中流式响应?
  • expressjs -管道到响应流不工作

我们将在js中创建一个time.sleep()替代品。首先创建一个调用setTimeout的函数。

function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}

使用await调用此函数。在这里了解更多关于await的信息

await sleep(3000) // waits for 3 seconds

相关内容

  • 没有找到相关文章

最新更新