Javascript 为什么我的文件来自图像;“请求”;保存到谷歌云存储时不完整?
我正试图将一张图片从URL上传到我的谷歌云存储(Firebase)。以下函数将返回文件,连续函数将检索新文件的实际签名/下载Url。在所有这些之后,我正在用新的URL更新Firestore数据库中的一个文档。这一部分起作用;函数等待上载(不幸的是不完整的)图像,我的文档将使用新创建的文件url进行更新。但实际的文件/图像不完整:-( 保存/上载/流式传输到我的云存储文件的图像如下所示: 我尝试过使用node fetch和request并以多种方式重写我的函数,但结果总是这样。我确信这与我如何使用承诺有关,因为如果我忽略承诺,文件实际上会完成,但主代码会继续执行,而不是等待这个承诺 结果相同(文件不完整): 直接返回流将写入一个完整的文件,但我的主代码没有等待该文件(我需要处理该文件)Javascript 为什么我的文件来自图像;“请求”;保存到谷歌云存储时不完整?,javascript,node.js,google-cloud-storage,Javascript,Node.js,Google Cloud Storage,我正试图将一张图片从URL上传到我的谷歌云存储(Firebase)。以下函数将返回文件,连续函数将检索新文件的实际签名/下载Url。在所有这些之后,我正在用新的URL更新Firestore数据库中的一个文档。这一部分起作用;函数等待上载(不幸的是不完整的)图像,我的文档将使用新创建的文件url进行更新。但实际的文件/图像不完整:-( 保存/上载/流式传输到我的云存储文件的图像如下所示: 我尝试过使用node fetch和request并以多种方式重写我的函数,但结果总是这样。我确信这与我如何使
谢谢你在这方面的帮助!所以这是最终对我有用的代码
return new Promise((resolve, reject) => {
const req = request(fileUrl);
req.pause();
req.on('response', res => {
const writeStream = file.createWriteStream({
metadata: {
contentType: res.headers['content-type']
}
});
req.pipe(writeStream)
.on('finish', () => {
console.log('Photo saved');
resolve(file);
})
.on('error', err => {
writeStream.end();
console.error(err);
reject();
});
req.resume();
});
req.on('error', err => console.error(err));
});
return await fetch(fileUrl).then(res => {
const contentType = res.headers.get('content-type');
const writeStream = file.createWriteStream({
metadata: {
contentType
}
});
let p = new Promise((resolve, reject) => {
res.body.pipe(writeStream);
writeStream.on('finish', function() {
console.log("Stream finished")
resolve(file);
});
writeStream.on('error', function() {
reject(new Error("Whoops!"));
});
});
return p.then(
function(file) {
console.log('Photo saved');
return file},
function(error) {
console.error(error);
return;
});
});
return res.body.pipe(writeStream)
.on('finish', () => {
return file;
console.log('Photo')
})
.on('error', err => {
return console.error(err);
});
return new Promise((resolve, reject) => {
const req = request(fileUrl);
req.pause();
req.on('response', res => {
const writeStream = file.createWriteStream({
metadata: {
contentType: res.headers['content-type']
}
});
req.pipe(writeStream)
.on('finish', () => {
console.log('Photo saved');
resolve(file);
})
.on('error', err => {
writeStream.end();
console.error(err);
reject();
});
req.resume();
});
req.on('error', err => console.error(err));
});