这是我的代码:
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,这是我拥有的复制功能,如果它是相关的,它将完美运行。
感谢您的任何建议。
答案 0 :(得分:2)
从您的脚本中,我认为您可能正在使用版本超过v24.0.0的googleapis。那么如何修改googleapis的版本呢?我也遇到了同样的问题。在我的情况下,通过将googleapis的版本修改为v24.0.0来删除该问题。
当我使用googleapis的v25.0.0 - v30.0.0时,会发生错误。当它使用v24.0.0的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)
}
)
})