8x13b
8x13b

Reputation: 3

Google Drive API returning [Object]

I'm currently trying to list all files that are an image in a google drive folder, and download them to ./images/{filename}.{extension}.

I got most up and running, but it's returning

files: [
      [Object], [Object], [Object], [Object], [Object], [Object],
      [Object], [Object], [Object], [Object], [Object], [Object],
      [Object], [Object]
    ]

Here is my code: (node v14, googleapis@39 (i think?))

const fs = require('fs');
const readline = require('readline');
const config = require('./options.json')
const {
  google
} = require('googleapis');

// If modifying these scopes, delete token.json.
const SCOPES = ['https://www.googleapis.com/auth/drive'];
// The file token.json stores the user's access and refresh tokens, and is
// created automatically when the authorization flow completes for the first
// time.
const TOKEN_PATH = 'token.json';

// Load client secrets from a local file.
fs.readFile('credentials.json', (err, content) => {
  if (err) return console.log('Error loading client secret file:', err);
  // Authorize a client with credentials, then call the Google Drive API.
  authorize(JSON.parse(content), listFiles);
});

/**
 * Create an OAuth2 client with the given credentials, and then execute the
 * given callback function.
 * @param {Object} credentials The authorization client credentials.
 * @param {function} callback The callback to call with the authorized client.
 */
function authorize(credentials, callback) {
  const {
    client_secret,
    client_id,
    redirect_uris
  } = credentials.installed;
  const oAuth2Client = new google.auth.OAuth2(
    client_id, client_secret, redirect_uris[0]);

  // Check if we have previously stored a token.
  fs.readFile(TOKEN_PATH, (err, token) => {
    if (err) return getAccessToken(oAuth2Client, callback);
    oAuth2Client.setCredentials(JSON.parse(token));
    callback(oAuth2Client);
  });
}

/**
 * Get and store new token after prompting for user authorization, and then
 * execute the given callback with the authorized OAuth2 client.
 * @param {google.auth.OAuth2} oAuth2Client The OAuth2 client to get token for.
 * @param {getEventsCallback} callback The callback for the authorized client.
 */
function getAccessToken(oAuth2Client, callback) {
  const authUrl = oAuth2Client.generateAuthUrl({
    access_type: 'offline',
    scope: SCOPES,
  });
  console.log('Authorize this app by visiting this url:', authUrl);
  const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
  });
  rl.question('Enter the code from that page here: ', (code) => {
    rl.close();
    oAuth2Client.getToken(code, (err, token) => {
      if (err) return console.error('Error retrieving access token', err);
      oAuth2Client.setCredentials(token);
      // Store the token to disk for later program executions
      fs.writeFile(TOKEN_PATH, JSON.stringify(token), (err) => {
        if (err) return console.error(err);
        console.log('Token stored to', TOKEN_PATH);
      });
      callback(oAuth2Client);
    });
  });
}

/**
 * Lists the names and IDs of up to 10 files.
 * @param {google.auth.OAuth2} auth An authorized OAuth2 client.
 */
function listFiles(auth) {
  const drive = google.drive({
    version: 'v3',
    auth
  });
  drive.files.list({
    folderId: config.folderID,
    q: "mimeType contains 'image' and trashed = false"
  }, function(error, response) {
    if (error) {
      return console.log("ERROR", error);
    }
    console.log(response);
    
    response.items.forEach(function(item) {
      var file = fs.createWriteStream("./" + item.title);
      file.on("finish", function() {
        console.log("downloaded", item.title);
      });

      // Download file
      drive.files.get({
        fileId: item.id,
        alt: "media"
      }).pipe(file);
    });
  });
}

This code is mostly copy-paste code, and I have to rewrite it, but I need a some-what working version to start. Thanks!

Upvotes: 0

Views: 241

Answers (1)

Tanaike
Tanaike

Reputation: 201553

I believe your goal and your situation as follows.

  • You want to download the image files from the specific folder.
  • You want to achieve this using [email protected] for Node.js.
  • You have already been able to download a file from Google Drive using Drive API.

In order to achieve your goal, I would like to propose the following modification.

Modification points:

  • I think that your script tries to use the properties for Drive API v2 with Drive API v3. For example, items and title for v2 are files and name for v3, respectively.
    • I thought that one of reasons of your issue might be this.
  • About drive.files.list({folderId: config.folderID, q: "mimeType contains 'image' and trashed = false"}), unfortunately, folderId cannot be used. In this case, please include the folder ID in q.
  • About the method for downloading the files, you can see the sample scripts at this thread.

When above points are reflected to your script, it becomes as follows.

Modified script:

function listFiles(auth) {
  const drive = google.drive({
    version: "v3",
    auth,
  });

  const folderId = "###"; // <--- Please set the folder ID.

  drive.files.list(
    {
      q: `mimeType contains 'image' and trashed = false and '${folderId}' in parents`,
    },
    function (error, response) {
      if (error) {
        return console.log("ERROR", error);
      }
      console.log(response.data);
      const items = response.data.files;
      items.forEach(function (item) {
        drive.files
          .get({ fileId: item.id, alt: "media" }, { responseType: "stream" })
          .then((res) => {
            const dest = fs.createWriteStream("./" + item.name);
            res.data
              .on("end", () => {
                console.log("downloaded", item.name);
              })
              .on("error", (err) => {
                throw new Error(err);
              })
              .pipe(dest);
          });
      });
    }
  );
}
  • When above script is used, when the image files are in the specific folder of folderId, the image files are downloaded.

Note:

References:

Upvotes: 1

Related Questions