1

您好,我一直在尝试解决这个问题,但无法在 node.js 中找到解决方案

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

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

上面的代码在 3 秒后发送第一个响应“Hello 1”,然后等待 10 秒并将“Hello 2”添加到响应中。我正在尝试在 Node.js 中重新创建它,但不知道该怎么做。这是我当前的代码:

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

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

4

2 回答 2

1

使用 python 流式传输内容

根据 python doc,生成器用于数据流

有时,您希望向客户端发送大量数据,远远超过您希望保留在内存中的数据。但是,当您动态生成数据时,如何在不往返文件系统的情况下将其发送回客户端?

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

检查这些参考:

使用 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);

检查这些参考:

于 2021-10-26T14:36:42.003 回答
0

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

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

用于await调用该函数。在此处了解有关等待的更多信息。

await sleep(3000) // waits for 3 seconds
于 2021-10-26T14:19:54.757 回答