【问题标题】:Node.js Google Drive api Download file errorNode.js Google Drive api 下载文件错误
【发布时间】:2018-10-26 15:30:50
【问题描述】:

这是我的代码:

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;

按照谷歌文档LINK

我尝试过的所有其他功能,如列表、复制、上传或表格读写对我来说都非常适合,除了下载。我的应用程序立即因错误而崩溃

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

我查看了谷歌的这个功能的示例,但我没有发现任何不同之处,那么为什么它对谷歌开发者有效,而对我却不起作用?

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

-- 我将包含THIS LINK,这是我拥有的复制功能,它可以完美运行,以防万一。

感谢您的建议。

【问题讨论】:

  • 很抱歉我的回答对您的情况没有用处。
  • 抱歉,我只是在测试积分系统在 SO 上的工作方式,不知道在我更改任何内容时你会收到通知。通过标记你的答案,我实际上得到了更多的分数。我确实说过我做了不同的事情,所以实际上你的解决方案不是我的解决方案,但它也会起作用,这就是为什么我之前标记它并且我站在标记后面,我只是好奇了一下。
  • 感谢您的回复。我可以理解它。

标签: node.js google-api google-drive-api


【解决方案1】:

根据您的脚本,我认为您使用的可能是 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的版本,然后重试。修改版本解决的案例如下。

参考资料:

如果这对您的情况没有帮助,我很抱歉。

编辑:

这个修改怎么样?在我的环境中,我确认此修改由 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);

收件人:

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

【讨论】:

  • 嗯,感谢您的回复,但我正在构建的这项服务已经非常庞大,使用旧版本意味着重建太大的一部分。我将不得不尝试另一种方式。
  • @Richard Franek 对于给您带来的不便,我深表歉意。我没有注意到您无法从您的问题中更改 googleapis 的版​​本。我真的很抱歉我的英语水平不好。
  • 我没有考虑到版本可能是一个解决方案的可能性,你确实帮了一点忙,我现在正在创建自己的 GET 方法来下载 node.js,因为谷歌的已损坏。至少,多亏了你,我知道问题不在于我的代码。
  • 是的,这确实有效。甚至在之前,我对我在下面发布的解决方案有了一个想法,并且效果也很好,但我会将其标记为答案,因为为什么不这样做。
  • @Richard Franek 很高兴您的问题得到了解决。我也可以从你的问题中学习。也谢谢你。我想在我以后的帖子中将您的问题添加到我的答案的这些参考中。我认为这些对其他用户会有用。
【解决方案2】:

我修改了 Google 的示例。这样就可以了:

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;

【讨论】:

【解决方案3】:

我正在使用 Google drive Api 并创建了 google docs 文件。它存储在谷歌驱动器中。现在我想在 Nodejs 的 MS word 文档中导出这个 google 文档。为此,我使用了谷歌驱动器导出文件 api,它返回 Byte 中的数据,如谷歌驱动器开发者官方网站Google Drive Export File 中所述。但我想要 doc/docx 文件中的 bytes 数据。所以我尝试了很多东西,最后我得到了解决方案,现在它工作正常。

现在我可以在任何类型的文件中下载谷歌文档...在此代码中,我正在将数据导出到 MS wordDocument 但如果您想在其他类型的文件中下载“文档”,那么只需更改“mimeType”即可只需结帐mimeType Formats。并更改创建文件“Extention”(resume.docx

const fs = require('fs');
const { google } = require('googleapis');
const ROOT = require('path').resolve("./")


const Export = async (file_id = '13izcbyZ_eUhY6y6Ac_pYsR0Hip2vaP8WZ4stizsjfR4') => {
    try { 

        // Authenticate with google service account
        const auth = new google.auth.GoogleAuth({ // Scopes can be specified either as an array or as a single, space-delimited string.
            keyFile: `${ROOT}/credential.json`,
            scopes: ['https://www.googleapis.com/auth/documents', 'https://www.googleapis.com/auth/drive', 'https://www.googleapis.com/auth/drive.file',]
        });

        // Acquire an auth client, and bind it to all future calls
        const authClient = await auth.getClient();
        google.options({auth: authClient});
        const drive = google.drive({version: 'v3'});


        let progress = 0;

        // Set the location For store export file
        var dest = await fs.createWriteStream(ROOT + "/public/merge/resume.docx");

        // Calling google drive export api
        let resp = await drive.files.export({
            fileId: file_id,
            mimeType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
        }, {responseType: 'stream'});


        resp.data.on('end', function () {
            console.log('Done');
        }).on('error', function (err) {
            console.log('Error during download', err);
        }).on('data', d => {
            progress += d.length;
            if (process.stdout.isTTY) {
                process.stdout.clearLine();
                process.stdout.cursorTo(0);
                process.stdout.write(`Downloaded ${progress} bytes`);
            }
        }).pipe(dest)

        let DownloadURL = "localhost:3001/merge/resume.docx";

        return DownloadURL;
    } catch (err) {
        console.log("err........", err)
    }
}

【讨论】:

    【解决方案4】:

    只是添加到@Tanaike 的答案,这是一个承诺的版本,以防其他人到达这里寻找这样的人(比如我自己):

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-30
      • 1970-01-01
      • 1970-01-01
      • 2015-11-17
      • 2015-02-06
      • 2022-01-03
      相关资源
      最近更新 更多