Node.js Google Drive api Ошибка загрузки файла - PullRequest
0 голосов
/ 16 мая 2018

Это мой код:

const fs = require('fs');
const { google } = require('googleapis');
const Auth = require('../authorization/auth_drive/auth');

// get data
var gotData = function downloadFiles(fileId, callback) {
    let content = fs.readFileSync('./GEARS/authorization/client_secret.json');
    Auth(JSON.parse(content), (auth) => {
        //const returnData = [];
        const drive = google.drive({ version: 'v3', auth });

        const fileId = '';
        const dest = fs.createWriteStream('./test_files/test.png');

        drive.files.get({fileId: fileId, alt: 'media'})
        .on('end', () => {
            console.log('Done');
        })
        .on('error', err => {
            console.log('Error', err);
        })
        .pipe(dest);
    });
};

module.exports = gotData;

В соответствии с документацией Google ССЫЛКА

Все остальные функции, которые я пробовал, такие как Список, Копирование, Загрузка или Листы Чтение и записьработают отлично для меня, за исключением загрузки.Мое приложение мгновенно вылетает с ошибкой

TypeError: Невозможно прочитать свойство 'on' из неопределенного

Я посмотрел образец Google именно этой функции, и я ненашел что-то, что отличается, так почему это работает для разработчиков Google, а для меня - нет?

Я не нашел ни одного человека с этой проблемой в Google, так что, может быть, если вы понимаете, что должно бытьГотово, вы можете видеть, что я делаю неправильно.

- я включу ЭТУ ССЫЛКУ , то есть функцию копирования, которая у меня есть, которая отлично работает, если это будет уместно.

Спасибо за любой совет.

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Я изменил пример Google.Так работает:

const fs = require('fs');
const { google } = require('googleapis');
const Auth = require('../authorization/auth_drive/auth');

// get data
var gotData = function downloadFiles(fileId, destination, callback) {
    let content = fs.readFileSync('./GEARS/authorization/client_secret.json');
    Auth(JSON.parse(content), (auth) => {
        const returnData = [];
        const drive = google.drive({ version: 'v3', auth });

        const file = fs.createWriteStream(destination);

        drive.files.get(
        {fileId: fileId, alt: 'media',}, 
        {responseType: 'stream'}, (err, { data }) => {
            if (err) {
                returnData.push(["ERR"]);
                returnData.push("" + err);
            } else {
                data.pipe(file);
                returnData.push("Downloaded");
            }
            callback(returnData);
        });
    });
};

module.exports = gotData;
0 голосов
/ 17 мая 2018

Из вашего скрипта я подумал, что вы можете использовать googleapis версии более v24.0.0. Так как насчет изменения версии googleapis? Также я испытал ту же проблему с вашей ситуацией. В моем случае проблема была устранена путем изменения версии googleapis на v24.0.0.

Когда я использовал googleapis v25.0.0 - v30.0.0, возникает ошибка. Когда он использовал googleapis v24.0.0, ошибка была удалена.

Примечание:

  • Для googleapis после версии v25.0.0 сообщается о некоторых ошибках API и опций. Я считаю, что эти ошибки будут устранены в будущем. Так что, если для API и используемых вами опций возникают ошибки, измените версию googleapis и повторите попытку. Случаи, которые были решены путем изменения версии, следующие:

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

Если это не помогло в вашей ситуации, извините.

Редактировать:

Как насчет этой модификации? В моем окружении я подтвердил, что эта модификация работала googleapis версии 30.0.0.

От:

drive.files.get({fileId: fileId, alt: 'media'})
.on('end', () => {
    console.log('Done');
})
.on('error', err => {
    console.log('Error', err);
})
.pipe(dest);

Кому:

drive.files.get({fileId: fileId, alt: 'media'}, {responseType: 'stream'},
    function(err, res){
        res.data
        .on('end', () => {
            console.log('Done');
        })
        .on('error', err => {
            console.log('Error', err);
        })
        .pipe(dest);
    }
);
...