截至 2024 年 1 月 26 日星期五,我们的 Firebase 云功能在尝试下载视频资源时开始失败。我们已经成功使用以下设置一年了,但截至昨天,如果我们没有更改代码,它就开始失败。
设置:
import { getStorage } from 'firebase-admin/storage';
const fileName = path.basename(filePath);
const bucket = getStorage().bucket();
const downloadFilePath = path.join(os.tmpdir(), fileName);
functions.logger.log(
'In thumbnail creation, video downloaded locally to',
downloadFilePath,
);
const downloadFile = () => {
return new Promise((resolve, reject) => {
const stream = bucket.file(filePath).createReadStream();
stream.on('data', (data) => {
console.log('🚀 ~ PromptService ~ data ~ data:', data);
return;
});
stream.on('error', (err) => {
console.log('🚀 ~ PromptService ~ err ~ err:', err);
return reject;
});
stream.on('end', (data: any) => {
console.log('🚀 ~ PromptService ~ err ~ err:', data);
return resolve;
});
stream.pipe(fs.createWriteStream(downloadFilePath));
functions.logger.log(
`gs://${bucket.name}/${fileName} downloaded to ${downloadFilePath}.`,
);
});
};
// Downloads the file
console.log('downloading file');
await downloadFile();
console.log('finished downloading file');
我正在使用文件缓冲区从数据侦听器接收控制台日志,但在最终侦听器触发错误之前失败。
我也尝试过下载方法,但没有成功。
bucket.file(filePath).download()
我期望文件传输完成并通过管道传输到写入流,我可以在其中使用该文件来制作屏幕截图。
由于我的云函数运行时环境(节点 20)出现问题,我最终切换到谷歌云 TransferManager 并实现
downloadFileInChunks
以使其正常工作。 download
和 createReadStream
存在名为 stream-shift
的依赖项问题。如果您遇到类似问题,请参阅此链接https://github.com/googleapis/nodejs-storage/issues/2368
新实施
const transferManager = new TransferManager(bucket);
// Downloads the files
await transferManager.downloadFileInChunks(inputPath, {
destination: downloadFilePath,
});