Node.js Google Drive api 下载文件错误
Posted
技术标签:
【中文标题】Node.js Google Drive api 下载文件错误【英文标题】:Node.js Google Drive api Download file error 【发布时间】: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 上的工作方式,不知道在我更改任何内容时你会收到通知。通过标记你的答案,我实际上得到了更多的分数。我确实说过我做了不同的事情,所以实际上你的解决方案不是我的解决方案,但它也会起作用,这就是为什么我之前标记它并且我站在标记后面,我只是好奇了一下。 感谢您的回复。我可以理解它。 【参考方案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的版本,然后重试。修改版本解决的案例如下。参考资料:
How do I update my google sheet in v4? Create a gmail filter with Gmail API nodejs, Error: Filter doesn't have any criteria Insufficient Permission when trying to create a folder on Google Drive via API(v3) Youtube Data API V3 - Error fetching video with google.youtube.videos.list() Google drive API - Cannot read property 'OAuth2' of undefined How to run a Google App Script using Google API Service Library (Node.js)如果这对您的情况没有帮助,我很抱歉。
编辑:
这个修改怎么样?在我的环境中,我确认此修改由 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;
【讨论】:
这是 google oAuth,我想我遵循了这个文档:developers.google.com/people/quickstart/nodejs【参考方案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)
)
)
【讨论】:
以上是关于Node.js Google Drive api 下载文件错误的主要内容,如果未能解决你的问题,请参考以下文章
Google Drive API失败,因为库的google.drive功能不存在
Google Drive Node.js - 从节点v7更新到v9后上传文件时出错
Drive Builder错误:API Google Drive Spring Boot
通过 Google Drive API 从本地 CSV 文件创建 Google Drive 电子表格