在继续使用 Google Drive Api 之前如何等待 file.get 下载?
How to wait for file.get to download before moving on with Google Drive Api?
我正在尝试使用 Google 驱动器 API 从 Google 驱动器下载一个文件,似乎我在这个 。话虽如此,直到程序崩溃后 fs 才会写入文件。这使我相信我可以对文件进行某种 async/await 的实际下载,但我不太了解具体下载位置。
我试图使回调函数异步并等待 writeFile 但它似乎没有工作。
imageHash.js
async function hasher() {
...
...
...
for (let googImage of googlePosts) {
const googleDownload = sharedFunc.downloadGoogle(googImage.id); //here is where it's supposed to download the image
const hash1 = await imghash.hash('../images/options1.png', 8, 'binary'); //I download this image earlier on and is fine.
const hash2 = await imghash.hash('../images/options2.jpg', 8, 'binary'); //code generates an error here
const comp = await leven(hash1, hash2);
console.log(comp);
...
...
}
...
...
}
moduleExports.js
module.exports = {
...
...
downloadGoogle: async (fileID) => {
drive.files.get({fileId: fileID, alt: 'media'}, { responseType: "arraybuffer" },
function(err, { data }) {
fs.writeFile("../images/options2.jpg", Buffer.from(data), err => {
if (err) console.log(err);
});
}
);
},
...
...
}
我还尝试将图像下载器库与 Google 驱动器 link 一起使用,因为我可以轻松访问文件 ID,但它似乎无法下载图像,尽管如此直接报错url。如果有人知道如何使用这个库下载图像,我会接受这个作为答案,因为我已经知道如何等待库下载图像。
如果您为此需要示例图片,可以使用下面的图片
https://drive.google.com/uc?id=1ttF46_rexGt_ir2Wx-H9Oi58og4DGEYg
您可以将 downloadGoogle 函数设为 promise 函数。更多详细信息可以在这里找到。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
基本上,你会
module.exports = {
...
...
downloadGoogle: (fileID) => {
return new Promise((resolve, reject) => { // make the function a promise
drive.files.get({fileId: fileID, alt: 'media'}, { responseType: "arraybuffer" },
function(err, { data }) {
fs.writeFile("../images/options2.jpg", Buffer.from(data), err => {
if (err) {
console.log(err);
return reject (err);
}
return resolve('file saved.')
});
}
);
});
},
...
...
}
然后你可以这样称呼它:
const googleDownload = await sharedFunc.downloadGoogle(googImage.id); //here is where it's supposed to download the image
如果您查看文档 google 给出了这个 download 示例
var fileId = '0BwwA4oUTeiV1UVNwOHItT0xfa2M';
var dest = fs.createWriteStream('/tmp/photo.jpg');
drive.files.get({
fileId: fileId,
alt: 'media'
})
.on('end', function () {
console.log('Done');
})
.on('error', function (err) {
console.log('Error during download', err);
})
.pipe(dest);
我正在尝试使用 Google 驱动器 API 从 Google 驱动器下载一个文件,似乎我在这个
我试图使回调函数异步并等待 writeFile 但它似乎没有工作。
imageHash.js
async function hasher() {
...
...
...
for (let googImage of googlePosts) {
const googleDownload = sharedFunc.downloadGoogle(googImage.id); //here is where it's supposed to download the image
const hash1 = await imghash.hash('../images/options1.png', 8, 'binary'); //I download this image earlier on and is fine.
const hash2 = await imghash.hash('../images/options2.jpg', 8, 'binary'); //code generates an error here
const comp = await leven(hash1, hash2);
console.log(comp);
...
...
}
...
...
}
moduleExports.js
module.exports = {
...
...
downloadGoogle: async (fileID) => {
drive.files.get({fileId: fileID, alt: 'media'}, { responseType: "arraybuffer" },
function(err, { data }) {
fs.writeFile("../images/options2.jpg", Buffer.from(data), err => {
if (err) console.log(err);
});
}
);
},
...
...
}
我还尝试将图像下载器库与 Google 驱动器 link 一起使用,因为我可以轻松访问文件 ID,但它似乎无法下载图像,尽管如此直接报错url。如果有人知道如何使用这个库下载图像,我会接受这个作为答案,因为我已经知道如何等待库下载图像。
如果您为此需要示例图片,可以使用下面的图片
https://drive.google.com/uc?id=1ttF46_rexGt_ir2Wx-H9Oi58og4DGEYg
您可以将 downloadGoogle 函数设为 promise 函数。更多详细信息可以在这里找到。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
基本上,你会
module.exports = {
...
...
downloadGoogle: (fileID) => {
return new Promise((resolve, reject) => { // make the function a promise
drive.files.get({fileId: fileID, alt: 'media'}, { responseType: "arraybuffer" },
function(err, { data }) {
fs.writeFile("../images/options2.jpg", Buffer.from(data), err => {
if (err) {
console.log(err);
return reject (err);
}
return resolve('file saved.')
});
}
);
});
},
...
...
}
然后你可以这样称呼它:
const googleDownload = await sharedFunc.downloadGoogle(googImage.id); //here is where it's supposed to download the image
如果您查看文档 google 给出了这个 download 示例
var fileId = '0BwwA4oUTeiV1UVNwOHItT0xfa2M';
var dest = fs.createWriteStream('/tmp/photo.jpg');
drive.files.get({
fileId: fileId,
alt: 'media'
})
.on('end', function () {
console.log('Done');
})
.on('error', function (err) {
console.log('Error during download', err);
})
.pipe(dest);