Я все еще очень молод, когда дело доходит до 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
Привет, Танайке, ответ от диска Google для этого метода возвращает json с дисками, связанными с учетной записью. Вот пример того, как должна выглядеть структура: {id: 'blahblah', name: 'blahblah', colorRgb: '#ff5722', kind: 'drive#drive'}
Спасибо за ответ. Из вашего ответа я предложил модифицированный сценарий в качестве ответа. Не могли бы вы подтвердить это? Если это не было полезно для вашей ситуации, я извиняюсь.
Сначала подтвердите версию 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 Спасибо за ответ. Я рад, что ваша проблема была решена. Когда я тестировал скрипт, я использовал drive
вот так. По этому я забыл его модифицировать. Прошу прощения за это. В вашем сценарии с помощью const drive = google.drive({ version: "v3", auth })
в качестве глобальной переменной, я думаю, вы также можете изменить function listDrives(drive) {
на function listDrives() {
.
Вот окончательное решение, которое сработало для этого вопроса, любезно предоставлено @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)
})
Я должен извиниться за мое плохое знание английского языка. К сожалению, я не могу понять
the actual object with the data
. Могу я спросить вас о деталях вашего ожидаемого значения?