尝试使用JavaScript SDK创建与Google Drive v3 api的连接。
基本上,我要实现的最终目标是从google驱动器访问各种文件并添加元数据(但还没有到此为止)。
通过google驱动器api指南(https://developers.google.com/drive/api/v3/quickstart/js)上的教程,可以正常运行,并且我可以授权自己访问文件等
我一直在努力清理代码,以免我一遍又一遍地重复自己。
我已经使用了GDrive Python SDK,我可以很好地使用它,但是我真的在JavaScript SDK上苦苦挣扎,这可能只是我需要进行现实检查,因为我正试图将python方面纳入JavaScript?
因此,以下代码循环遍历每个搜索结果页面,并在我的gDrive中找到扩展名为ZIP,RAR或TAR的所有文件,然后将结果插入HTML(以Google Drive示例为基础):
function listFiles() {
gapi.client.load('drive', 'v3', function () {
gapi.client.init({}
).then(function () {
gapi.client.drive.files.list({
'q': "fileExtension = 'zip' or fileExtension = 'rar' or fileExtension = 'tar'",
'pageSize': 10,
'fields': "nextPageToken, files(id, name)",
}).then(function (respo) {
var token = respo.result.nextPageToken;
gapi.client.drive.files.list({
'q': "fileExtension = 'zip' or fileExtension = 'rar' or fileExtension = 'tar'",
'fields': "nextPageToken, files(id, name)",
'pageToken': token
}).then(function (result) {
appendPre('Files:');
console.log(result);
var files = result.result.files;
if (files && files.length > 0) {
for (var i = 0; i < files.length; i++) {
var file = files[i];
console.log(files[i]);
arr.push(files[i]);
appendPre(file.name + ' (' + file.id + ')');
}
} else {
appendPre('No files found.');
}
})
});
});
});
}
这可行,但是我该如何清理呢?例如创建函数?我可能需要定期请求此文件列表,所以我尝试创建一个函数:
function getFiles() {gapi.client.load('drive', 'v3', function () {
gapi.client.init({}
).then(function () {
gapi.client.drive.files.list({
'q': "fileExtension = 'zip' or fileExtension = 'rar' or fileExtension = 'tar'",
'pageSize': 10,
'fields': "nextPageToken, files(id, name)",
}).then(function (respo) {
var token = respo.result.nextPageToken;
gapi.client.drive.files.list({
'q': "fileExtension = 'zip' or fileExtension = 'rar' or fileExtension = 'tar'",
'fields': "nextPageToken, files(id, name)",
'pageToken': token
})
})
})
});
}
但是当我称它为“未定义”
然后我读到某个地方,可以将其创建为变量,并像完整示例中那样用'.then'调用它。
但是在调用变量和执行'.then'时会给出'undefined':
getFiles.then(function(respo){console.log(respo)})
无法获取未定义或空引用的属性'then'
我在做什么错?显然有些东西,可能真的很愚蠢= [
任何帮助将不胜感激=]
答案 0 :(得分:0)
我已经尝试过您的代码,它正在我这边工作。验证后,您无需再次致电gapi.client.init({}).then()
。
这是工作代码:
function initClient() {
gapi.client.init({
discoveryDocs: DISCOVERY_DOCS,
clientId: CLIENT_ID,
scope: SCOPES
}).then(function () {
// Listen for sign-in state changes.
gapi.auth2.getAuthInstance().isSignedIn.listen(updateSigninStatus);
// Handle the initial sign-in state.
updateSigninStatus(gapi.auth2.getAuthInstance().isSignedIn.get());
authorizeButton.onclick = handleAuthClick;
//signoutButton.onclick = handleSignoutClick;
gapi.client.drive.files.list({
'q': "fileExtension = 'zip' or fileExtension = 'rar' or fileExtension = 'tar'",
'pageSize': 10,
'fields': "nextPageToken, files(id, name)",
}).then(function (respo) {
appendPre('Files:');
var files = respo.result.files;
if (files && files.length > 0) {
for (var i = 0; i < files.length; i++) {
var file = files[i];
appendPre(file.name + ' (' + file.id + ')');
}
} else {
appendPre('No files found.');
}
})
});
}
我已经将您的代码添加到了最初的initClient()
中,并且可以按预期工作。
@Tanaike是正确的,您可以将pageSize
调整为1000,以在一页中获取所有文件。但是请尝试阅读此tutorial来实现nextpageToken
更新
如果您指的是在Java脚本的函数内部调用的函数,则有可能,并且它也存在于Javascript快速入门中。
/**
* Initializes the API client library and sets up sign-in state
* listeners.
*/
function initClient() {
gapi.client.init({
discoveryDocs: DISCOVERY_DOCS,
clientId: CLIENT_ID,
scope: SCOPES
}).then(function () {
// Listen for sign-in state changes.
gapi.auth2.getAuthInstance().isSignedIn.listen(updateSigninStatus);
// Handle the initial sign-in state.
updateSigninStatus(gapi.auth2.getAuthInstance().isSignedIn.get());
authorizeButton.onclick = handleAuthClick;
signoutButton.onclick = handleSignoutClick;
});
}
/**
* Called when the signed in status changes, to update the UI
* appropriately. After a sign-in, the API is called.
*/
function updateSigninStatus(isSignedIn) {
if (isSignedIn) {
authorizeButton.style.display = 'none';
signoutButton.style.display = 'block';
listFiles();
} else {
authorizeButton.style.display = 'block';
signoutButton.style.display = 'none';
}
}
/**
* Print files.
*/
function listFiles() {
gapi.client.drive.files.list({
'pageSize': 10,
'fields': "nextPageToken, files(id, name)"
}).then(function(response) {
appendPre('Files:');
var files = response.result.files;
if (files && files.length > 0) {
for (var i = 0; i < files.length; i++) {
var file = files[i];
appendPre(file.name + ' (' + file.id + ')');
}
} else {
appendPre('No files found.');
}
});
}
如果您要检查代码,则initClient()
会调用函数updateSigninStatus
,该函数还会调用listFiles()
,该函数会在云端硬盘中打印可用文件。