你好,我一直在试图找出这一点,因为一段时间,但我无法找到一个解决方案,它在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