Node.js Google云端硬盘API下载文件错误

Ric*_*nek 5 google-api node.js google-drive-api

这是我的代码:

const fs = require('fs');
const { google } = require('googleapis');
const Auth = require('../authorization/auth_drive/auth');

// get data
var gotData = function downloadFiles(fileId, callback) {
    let content = fs.readFileSync('./GEARS/authorization/client_secret.json');
    Auth(JSON.parse(content), (auth) => {
        //const returnData = [];
        const drive = google.drive({ version: 'v3', auth });

        const fileId = '';
        const dest = fs.createWriteStream('./test_files/test.png');

        drive.files.get({fileId: fileId, alt: 'media'})
        .on('end', () => {
            console.log('Done');
        })
        .on('error', err => {
            console.log('Error', err);
        })
        .pipe(dest);
    });
};

module.exports = gotData;
Run Code Online (Sandbox Code Playgroud)

遵循Google文档 LINK

我尝试过的所有其他功能(例如“列表”,“复制”,“上载”或“工作表读取和写入”)对我来说都很合适,除了“下载”。我的应用程序立即因错误而崩溃

TypeError:无法读取未定义的属性“ on”

我已经看过Google的此功能示例,但没有发现任何不同之处,那么为什么它对Google Developers有效,而对我却无效?

我在Google上没有找到一个遇到此问题的人,所以也许,如果您了解应该做什么,就可以知道我做错了什么。

-我将包括THIS LINK,这是我拥有的复制功能,在需要的情况下可以完美地工作。

感谢您的任何建议。

Tan*_*ike 7

从您的脚本来看,我认为您可能正在使用v24.0.0以上版本的googleapi。那么如何修改googleapis版本呢?另外,您的情况也遇到了同样的问题。就我而言,该问题已通过将googleapis版本修改为v24.0.0来解决。

当我使用Googleapis的v25.0.0-v30.0.0时,发生错误。当它使用v24.0.0的googleapis时,该错误已消除。

注意 :

  • 对于v25.0.0版本之后的googleapi,报告了一些API和选项的错误。我相信将来会删除这些错误。因此,如果对于API和您使用的选项,会发生一些错误,请修改googleapis的版本,然后重试。通过修改版本解决的情况如下。

参考文献:

如果这对您的情况没有帮助,对不起。

编辑:

这个修改怎么样?在我的环境中,我确认此修改适用于v30.0.0版的googleapis。

来自:

drive.files.get({fileId: fileId, alt: 'media'})
.on('end', () => {
    console.log('Done');
})
.on('error', err => {
    console.log('Error', err);
})
.pipe(dest);
Run Code Online (Sandbox Code Playgroud)

至 :

drive.files.get({fileId: fileId, alt: 'media'}, {responseType: 'stream'},
    function(err, res){
        res.data
        .on('end', () => {
            console.log('Done');
        })
        .on('error', err => {
            console.log('Error', err);
        })
        .pipe(dest);
    }
);
Run Code Online (Sandbox Code Playgroud)


Ric*_*nek 4

我改变了谷歌的例子。这样它就可以工作:

const fs = require('fs');
const { google } = require('googleapis');
const Auth = require('../authorization/auth_drive/auth');

// get data
var gotData = function downloadFiles(fileId, destination, callback) {
    let content = fs.readFileSync('./GEARS/authorization/client_secret.json');
    Auth(JSON.parse(content), (auth) => {
        const returnData = [];
        const drive = google.drive({ version: 'v3', auth });

        const file = fs.createWriteStream(destination); // destination is path to a file

        drive.files.get(
        {fileId: fileId, alt: 'media',}, 
        {responseType: 'stream'}, (err,  res ) => {
            if (err) {
                returnData.push(["ERR"]);
                returnData.push("" + err);
            } else {
                res.data.pipe(file);
                returnData.push("Downloaded");
            }
            callback(returnData);
        });
    });
};

module.exports = gotData;
Run Code Online (Sandbox Code Playgroud)