node.js - 尝试查找文件 ID 时创建文件夹返回未定义
问题描述
我正在使用 Google drive API 创建一个文件夹,我想在创建后返回这个文件夹的 id,这样我就可以制作一个文件夹树。我不明白为什么我无法做到这一点,即使使用承诺我始终得到未定义文件夹 id 的结果。此代码为文件夹的 id 返回 undefined。我不想在创建文件夹后使用列表方法搜索驱动器,因为它很慢。有任何想法吗?
const fs = require('fs');
const readline = require('readline');
const {google, run_v1} = require('googleapis');
const SCOPES = ['https://www.googleapis.com/auth/drive'];
const TOKEN_PATH = 'token.json';
const CLIENT_NAME = 'Bowie, David';
const ROOT_FOLDER_LOCATION = '11ljl1lk1lk';
function getCreds(){
return new Promise((resolve, reject) => {
fs.readFile('credentials.json', (err, content) => {
if (err) {
reject('error loading client secret');
} else{
resolve(JSON.parse(content));
}
})
})
}
function authorize(creds){
const {client_secret, client_id, redirect_uris} = creds.installed;
const oAuth2Client = new google.auth.OAuth2(
client_id, client_secret, redirect_uris[0]);
return new Promise((resolve, reject) => {
fs.readFile(TOKEN_PATH, (err, token) => {
if (err) {
reject('this failed authorization');
} else {
oAuth2Client.setCredentials(JSON.parse(token));
resolve(oAuth2Client);
}
})
})
}
function makeRoot(auth) {
const drive = google.drive({version: 'v3', auth});
var fileMetadata = {
'name': CLIENT_NAME,
'mimeType': 'application/vnd.google-apps.folder',
'parents': [ROOT_FOLDER_LOCATION]
};
return new Promise((resolve, reject) => {
drive.files.create({
resource: fileMetadata,
fields: 'id'
}, function(err, file) {
if (err) {
reject(err);
} else {
resolve('Folder ID:', file.id);
}
})
})
}
async function doWork() {
try {
const response = await getCreds();
const oAuth2Client = await authorize(response);
const rootFolder = await makeRoot(oAuth2Client);
console.log(rootFolder);
} catch (err) {
console.log(err)
}
}
doWork();
我得到的唯一输出是“未定义”......
解决方案
修改点:
- 当您想使用 googleapis for Node.js 从创建的新文件夹中检索文件夹 ID 时,对于您的脚本,您可以使用
file.data.id
. 参考1 ,参考2 - 但是,在您的脚本中,
resolve('Folder ID:', file.id);
运行rootFolder
时间const rootFolder = await makeRoot(oAuth2Client);
是Folder ID:
.
当您要检索 的值时Folder ID:###folderId###
,请进行如下修改。
从:
resolve('Folder ID:', file.id);
至:
resolve("Folder ID:" + file.data.id);
如果要分隔 和 的值
Folder ID:
,###folderId###
还可以使用下面的修改。在这种情况下,您可以检索文件夹 ID,例如const [text, rootFolder] = await makeRoot(oAuth2Client);
.resolve(["Folder ID:", file.data.id]);
参考:
推荐阅读
- windows - 我已经在 Windows 7 32 位上安装了 GIT,但 Git Bash 没有打开
- python - 如何在python中逐行搜索一个字符串
- javascript - 检测 xhr 请求的开始和停止
- python - 从列表中查找目录时如何返回True?
- python - 在树莓派上运行 tflite 图像分类时没有响应
- c++ - 为什么我必须为分配器的一个实例分配一个值?
- c# - 数据模板不适用
- javascript - 级联反应组件
- c# - System.InvalidOperationException: '没有为具有不变名称'System.Data.SQLite' 的 ADO.NET 提供程序找到实体框架提供程序
- rust - 不可变对象根据函数签名更改为可变对象