为什么多次从 node.js 服务器下载文件会导致文件为空

Why downloading a file from node.js server multiple times results in empty files

很高兴得到一些帮助。

这是我的问题:

我用 node.js 构建了一个网络服务器,当通过特定路由请求时,它应该向客户端发送一个 csv 文件。 csv 文件是使用 fast-csv 包从 json 创建的。 json 数据来自 mongoDB 并使用 mongoose 进行处理。 当我请求这条路线一次时,它工作正常。然而,当它被第二次请求时,一个空文件被发送到客户端。顺便说一句,headers 正确到达客户端。 我必须重新启动服务器才能再次下载我的文件。

我尝试了什么:

基本上,我现在已经忘记了我尝试过的一切。使用邮递员和通过浏览器查询时都会出现此行为。 我已经尝试在我的处理程序函数中实现承诺。 我试过退订 res 以某种方式(但是,是的,这是一种愚蠢的方法)。 我试图将文件写入 fs 并在第二次请求时发送它。 ...

也许你们中的一个人一眼就能看出这里出了什么问题:

const { format } = require("@fast-csv/format");
const csvStream = format({ delimiter: ";", headers: true });

const router = express.Router();

router.route("/:collection/csv").get(requireModel, createCsv);

const csvFromDatabase = (data, res) => {
  csvStream.pipe(res);

  const processData = (data) => {
    data.forEach((row) => {
      const { _id, __v, ...newRow } = row._doc;
      csvStream.write({ ...newRow });
    });
    csvStream.end();
  };
  processData(data);
};

const createCsv = async (req, res) => {
  const { model } = req;
  const items = await model.find({});
  res.setHeader("Content-disposition", "attachment; filename=file.csv");
  res.setHeader("Content-type", "text/html; charset=UTF-8");
  csvFromDatabase(items, res);
};

非常感谢您的帮助。我希望我没有提出太愚蠢的问题让你厌烦。

您需要为每个新请求重新创建 csvStream

const csvFromDatabase = (data, res) => {
  const csvStream = format({ delimiter: ";", headers: true });
  
  csvStream.pipe(res);
  …
};