Return 来自 google 的对象在 nodejs 中驱动 api 函数

Return an object from google drive api function in nodejs

我对 NodeJS 和 Async/Await/Promises 的工作方式仍然很陌生,所以当您阅读我的解释和代码示例时,请耐心和同情。 我正在尝试以函数的形式创建模块来管理项目的不同部分,这些部分将使用 Google 驱动器 API 请求数据并将其推送到将用于的 MongoDB 集合跟踪不同的操作,如上传、下载等。我已经通过将函数的结果写入 JSON 文件并解析它们来实现这一点,但效率不高。我想从调用 Google API 的函数中 return 一个对象来列出驱动器、文件等,然后我可以将其直接发送到 MongoDB 集合。 这是我列出驱动器的函数示例,注意我可以记录结果并将它们写入 JSON 但不能 return 包含数据的实际对象。 非常感谢您的帮助,我欢迎您提供任何指导。

// Import Google library and token for account
const { google } = require('googleapis')
const credentials = require('./Creds/token.json')
const scopes = [
    'https://www.googleapis.com/auth/drive'
]
const auth = new google.auth.JWT(
    credentials.client_email, null,
    credentials.private_key, scopes
)
const drive = google.drive({ version: "v3", auth })

// List all drives
async function listDrives() {
    const alldrives = await drive.drives.list({
        fields: '*',
    }, (err, res) => {
        if (err) throw err
        const drives = res.data.drives
        let results = []
        if (drives.length) {
            drives.forEach((file) => {
                results.push(file)
            })
        } else {
            results.push('No drives found in user account.')
        }
        //console.log(results) // <---- getting this in the console
        //results // <---- not getting this
        const fs = require('fs')
        fs.writeFileSync('./driveslist.json', JSON.stringify(results, null, 2)) // Results to json file works
    })
    return alldrives
}
let drivestouse = listDrives()
    .then(data => {
        data
    })
    .catch(err => {
        console.log(err)
    })
drivestouse

首先,请确认您正在使用的 Node.js 的 googleapis 版本。我使用 googleapis@100.0.0 测试了我建议的脚本。目前看来,googleapis@100.0.0是最新版本。

在你的脚本中,做如下修改怎么样?

发件人:

// List all drives
async function listDrives() {
    const alldrives = await drive.drives.list({
        fields: '*',
    }, (err, res) => {
        if (err) throw err
        const drives = res.data.drives
        let results = []
        if (drives.length) {
            drives.forEach((file) => {
                results.push(file)
            })
        } else {
            results.push('No drives found in user account.')
        }
        //console.log(results) // <---- getting this in the console
        //results // <---- not getting this
        const fs = require('fs')
        fs.writeFileSync('./driveslist.json', JSON.stringify(results, null, 2)) // Results to json file works
    })
    return alldrives
}
let drivestouse = listDrives()
    .then(data => {
        data
    })
    .catch(err => {
        console.log(err)
    })
drivestouse

收件人:

// List all drives
function listDrives(drive) {
  return new Promise((resolve, reject) => {
    drive.drives.list(
      { fields: "drives(id,name,colorRgb,kind)" },
      (err, res) => {
        if (err) {
          reject(err.errors);
          return;
        }
        resolve(res.data.drives);
      }
    );
  });
}

listDrives()
  .then((data) => {
    console.log(data);
  })
  .catch((err) => {
    console.log(err);
  });
  • 当这个修改脚本为运行时,用console.log(data)得到如下结果。

      [
        { kind: 'drive#drive', id: '###', name: '###', colorRgb: '###' },
        ,
        ,
        ,
      ]
    

注:

  • 此修改后的脚本假定您已经能够从共享驱动器中获取值。请注意这一点。

参考文献:

这是解决这个问题的最终解决方案,由@Tanaike 提供。我只是想通过包含整个代码块并将参数添加到调用函数的部分来澄清:

// Import Google library and token for account
const { google } = require('googleapis')
const credentials = require('./Creds/token.json')
const scopes = [
    'https://www.googleapis.com/auth/drive'
]
const auth = new google.auth.JWT(
    credentials.client_email, null,
    credentials.private_key, scopes
)
const drive = google.drive({ version: "v3", auth })

// List all drives
function listDrives(drive) {
    return new Promise((resolve, reject) => {
        drive.drives.list(
            { fields: "drives(id,name,colorRgb,kind, createdTime)" }, // <=== Add '*' to get all properties
            (err, res) => {
                if (err) {
                    reject(err.errors)
                    return
                }
                resolve(res.data.drives)
            }
        )
    })
}

listDrives(drive) // <=== It was missing this parameter
    .then((data) => {
        console.log(data)
    })
    .catch((err) => {
        console.log(err)
    })