【问题标题】:Create folder returns undefined when trying to find file id尝试查找文件 ID 时创建文件夹返回未定义
【发布时间】:2021-08-11 19:50:21
【问题描述】:

我正在使用 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();

我得到的唯一输出是“未定义”...

【问题讨论】:

  • 如果你使用promises和其他async/await代码,使用node的fs/promises模块会容易得多

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


【解决方案1】:

修改点:

  • 如果您想使用 googleapis for Node.js 从创建的新文件夹中检索文件夹 ID,对于您的脚本,您可以使用 file.data.id 检索它。 Ref1, Ref2
  • 但是,在您的脚本中,当运行resolve('Folder ID:', file.id); 时,const rootFolder = await makeRoot(oAuth2Client); 中的rootFolderFolder 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]);
    

参考:

【讨论】:

  • 非常感谢@Tanaike,非常感谢,非常有帮助。
  • @jim 欢迎。谢谢你让我知道。我很高兴你的问题得到了解决。如果您的问题得到解决,请按接受按钮。与您有相同问题的其他人也可以将您的问题作为可以解决的问题。我认为您的问题和解决方案将对他们有用。如果找不到按钮,请随时告诉我。 stackoverflow.com/help/accepted-answer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
  • 1970-01-01
  • 2020-01-10
相关资源
最近更新 更多