Node.js Google Drive api下载文件错误

时间:2018-05-16 14:11:01

标签: node.js google-api 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;

关注google文档LINK

除了下载之外,我尝试过的所有其他功能,如列表,复制,上传或表单读取和写入工作都非常适合我。我的应用程序立即崩溃并出现错误

  

TypeError:无法读取' on'未定义的

我查看过谷歌此功能的示例,我没有发现任何不同的内容,那么为什么它适用于Google开发人员,而对我来说却没有?

我还没有找到一个人在谷歌这个问题,所以也许,如果你明白应该做什么,你可以看到我做错了什么。

- 我将包含THIS LINK,这是我拥有的复制功能,如果它是相关的,它将完美运行。

感谢您的任何建议。

3 个答案:

答案 0 :(得分:2)

从您的脚本中,我认为您可能正在使用版本超过v24.0.0的googleapis。那么如何修改googleapis的版本呢?我也遇到了同样的问题。在我的情况下,通过将googleapis的版本修改为v24.0.0来删除该问题。

当我使用googleapis的v25.0.0 - v30.0.0时,会发生错误。当它使用v24.0.0的googleapis时,错误已被删除。

注意:

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

参考文献:

如果这对你的情况没用,我很抱歉。

编辑:

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

来自:

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

致:

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);
    }
);

答案 1 :(得分:0)

我改变了谷歌的例子。这种方式有效:

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);

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

module.exports = gotData;

答案 2 :(得分:0)

只是为了添加@Tanaike的回答,这里有一个promisified版本,以防其他人来这里寻找这样的人(比如我自己):

await new Promise((resolve, reject) => {
  drive.files.get(
    {fileId: image.id, alt: 'media'},
    {responseType: 'stream'},
    (err, res) => {
      res.data.on('end', () => resolve()).on('error', () => reject()).pipe(dest)
    }
  )
})