为什么多次从 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);
…
};
很高兴得到一些帮助。
这是我的问题:
我用 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);
…
};