Вернуть объект из функции API Google Диска в nodejs

Я все еще очень молод, когда дело доходит до NodeJS и того, как работают Async/Await/Promises, поэтому, пожалуйста, будьте терпеливы и сострадательны, когда вы просматриваете мое объяснение и мой пример кода. Я пытаюсь создать модули в виде функций для управления различными частями проекта, которые будут запрашивать данные с помощью API Google Диска и передавать их в коллекции MongoDB, которые будут использоваться для отслеживания различных операций, таких как загрузка, загрузка и т. д. У меня это уже работает, записывая результаты функций в файлы JSON и анализируя их, но это неэффективно. Я хочу вернуть объект из функции, вызывающей API Google, для перечисления дисков, файлов и т. д., которые я мог бы затем отправить непосредственно в коллекцию MongoDB. Вот пример моей функции для вывода списка дисков. Обратите внимание, что я могу регистрировать результаты и записывать их в JSON, но не могу вернуть фактический объект с данными. Ваша помощь очень ценится, и я приветствую любые рекомендации, которые вы можете предложить.

// 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

Я должен извиниться за мое плохое знание английского языка. К сожалению, я не могу понять the actual object with the data. Могу я спросить вас о деталях вашего ожидаемого значения?

Tanaike 17.05.2022 02:42

Привет, Танайке, ответ от диска Google для этого метода возвращает json с дисками, связанными с учетной записью. Вот пример того, как должна выглядеть структура: {id: 'blahblah', name: 'blahblah', colorRgb: '#ff5722', kind: 'drive#drive'}

Robinsper 17.05.2022 13:59

Спасибо за ответ. Из вашего ответа я предложил модифицированный сценарий в качестве ответа. Не могли бы вы подтвердить это? Если это не было полезно для вашей ситуации, я извиняюсь.

Tanaike 17.05.2022 15:01
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
3
48
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Сначала подтвердите версию googleapis для Node.js, которую вы используете. Я протестировал предложенный мной сценарий с помощью 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: '###' },
        ,
        ,
        ,
      ]
    

Примечание:

  • Этот модифицированный скрипт предполагает, что вы уже смогли получить значения с общего Диска. Пожалуйста, будьте осторожны с этим.

Рекомендации:

Большое спасибо, Танайке, я отмечу этот вопрос как ответ, однако при вызове функции параметр «привод» отсутствовал. Я добавлю изменение ниже для тех, кто ищет этот ответ, чтобы получить фактический рабочий код. Спасибо за подробный и оперативный ответ.

Robinsper 17.05.2022 16:10

@Robinsper Спасибо за ответ. Я рад, что ваша проблема была решена. Когда я тестировал скрипт, я использовал drive вот так. По этому я забыл его модифицировать. Прошу прощения за это. В вашем сценарии с помощью const drive = google.drive({ version: "v3", auth }) в качестве глобальной переменной, я думаю, вы также можете изменить function listDrives(drive) { на function listDrives() {.

Tanaike 18.05.2022 00:58

Вот окончательное решение, которое сработало для этого вопроса, любезно предоставлено @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)
    })

Другие вопросы по теме

Машинописный текст: тип «Promise<void>» не может быть назначен типу «void | Деструктор
Можно ли вернуть ответ от выборки только обещанием (без асинхронности/ожидания)
Как запустить одну и ту же функцию JS несколько раз и дождаться завершения предыдущей?
При обработке всех обещаний и прочего, запрос Get не возвращает данные, все еще отправляет
Как вернуть обещание в асинхронной функции Javascript? Почему асинхронный метод не упаковывает возвращенное обещание?
Почему при использовании Fetch API почтовые запросы требуют больше входных данных, чем запросы на получение?
Какой конкретный пример простой функции async/await может быть выражен в виде промисов?
Почему thenables, которые возвращают обещание, основанное на том же обещании, что и thenable, не работают?
Функция ожидания Js внутри карты
Как запускать функцию карты (асинхронную, выборку, обещание) каждую секунду одну за другой, а не параллельно?