在继续使用 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);