如何解决节点流管道触发事件两次,并与客户端返回空响应
以下代码有问题。我正在从Google bigquery创建一个readstream,然后将其传递到转换流以将每个“行”格式化为csv,然后传递到writeStream到Google云存储以存储csv文件。管道完成后,我将文件链接返回给客户端。对于大小不超过90mb的文件,此方法效果很好。一旦文件变得比原来大得多,就会向客户端发送空白响应,并且不会引发任何错误。该文件是在存储分区中创建的,但链接不会发回。
router.post("/",requireLogin,async (req,res) => {
const bigquery = new BigQuery();
const { sql,filters } = generateSQL(req.body);
const storage = new Storage();
const bucket = storage.bucket("downloads-bucket");
const fields = req.body.fields.map(({ field,aggregation }) => ({
field: aggregation ? `${aggregation}_${field}` : field,type: aggregation ? "NUMBER" : fieldTypes[field],}));
const myTransform = new Transform({ objectMode: true });
myTransform._transform = function (chunck,encoding,done) {
this.push(
fields
.map(({ field,type }) => {
switch (type) {
case "STRING":
return `"${chunck[field].replace(/"/g,'""')}"`;
case "DATE":
if (chunck[field]) {
return chunck[field].value;
}
return chunck[field];
default:
return chunck[field];
}
})
.join(",") + "\n"
);
done();
};
try {
const fileName = `claims_data_${new Date()
.toLocaleString()
.split(",")[0]
.replace(/[\/,]/g,"-")
.replace(/ /g,"")}.${req.user.id}.csv`;
const file = bucket.file(fileName);
const writeStream = file.createWriteStream({
resumable: false,});
writeStream.write(
[
`"report date: ${new Date().toLocaleString()}"`,"","filters:",`${filters
.map(
(filter) =>
`"${filter
.replace("lines.","")
.replace(/(?<!\\)'/g,"")
.replace(/\\/g,"")
.replace(/"/g,'""')}"`
)
.join("\n")}`,`${fields.map((f) => f.field).join(",")} \n`,].join("\n")
);
const bqStream = bigquery.createQueryStream(sql);
pipeline(bqStream,myTransform,writeStream,(err) => {
if (err) {
console.log(err);
throw err;
} else {
file
.getSignedUrl({
version: "v4",action: "read",expires: Date.now() + 5 * 60 * 1000,// 5 minutes
})
.then(([url]) => res.json({ url,fileName }))
.catch((error) => console.log(error));
}
});
} catch (error) {
console.log(error);
return next(httpError(err));
}
});
服务器使用Express编写,并且该应用程序在Google App Engine标准环境中运行。 如果您记录流事件,则发生的一件奇怪的事情是,当事件较大时,它们都会触发两次。另外,我认为这可能与服务器或Google存储空间超时有关,但我尝试调整这些时间并记录它们,但它们似乎也从未触发。我确定这与管道的实现有关,但我不知道自己在做什么错。任何帮助将不胜感激。
谢谢
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。