0

Je ne comprends pas pourquoi mon code fonctionne uniquement en mode débogage. ma variable musiques dans mon function createMusicBox() est un objet en mode débogage et nul à ne pas debugjavascript & google api: le tableau fonctionne uniquement en mode débogage

var musiques = []; 

/** 
* 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) { 
    var clientSecret = credentials.installed.client_secret; 
    var clientId = credentials.installed.client_id; 
    var redirectUrl = credentials.installed.redirect_uris[0]; 
    var auth = new googleAuth(); 
    var oauth2Client = new auth.OAuth2(clientId, clientSecret, redirectUrl); 

    // Check if we have previously stored a token. 
    fs.readFile(TOKEN_PATH, function(err, token) { 
    if (err) { 
     getNewToken(oauth2Client, callback); 
    } else { 
     oauth2Client.credentials = JSON.parse(token); 
     callback(oauth2Client); 
    } 
    }); 
} 


/** 
* Lists the names and IDs of up to 10 files. 
* 
* @param {google.auth.OAuth2} auth An authorized OAuth2 client. 
*/ 
function listFiles(auth) { 
    var service = google.drive('v3'); 
    service.files.list({ 
    auth: auth, 
    pageSize: 10, 
    fields: "nextPageToken, files(id, name)" 
    }, function(err, response) { 
    if (err) { 
     console.log('The API returned an error: ' + err); 
     return; 
    } 
    var files = response.files; 
    if (files.length == 0) { 
     console.log('No files found.'); 
    } else { 
     musiques=files; 
     console.log('Files:'); 
     for (var i = 0; i < files.length; i++) { 
     musiques[i] = files[i]; 
     var file = files[i]; 
     console.log('%s (%s)', file.name, file.id); 
     } 
    } 
    }); 
} 

// this function pulls music in my google drive 

function createMusicBox() { 

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

    console.log(musiques); 
} 
+0

Je ne connaissez Node.js mais de la documentation 'fs.readFile' est une fonction asynchrone, probablement en mode débogage' musiques' a le temps d'être évalué dans la fonction asynchrone: [doc ici ...] (https://nodejs.org /api/fs.html#fs_fs_readfile_path_options_callback) – Baro

+0

vous avez raison, le script js s'exécute avant la fin de la fonction asynchrone. le problème est que je ne sais pas comment faire pour commander la fonction js en attente de la fin de la fonction asynchrone –

+1

il existe une version synchrone de 'fs.readFile' nommée' fs.readFileSync' [Doc] (https: // nodejs .org/api/fs.html # fs_fs_readfilesync_path_options) –

Répondre

0

je trouve une solution, je mets un rappel dans ListFiles et maintenant il fonctionne parfaitement

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

function getNewToken(oauth2Client, callback) { 
    var authUrl = oauth2Client.generateAuthUrl({ 
    access_type: 'offline', 
    scope: SCOPES 
    }); 
    console.log('Authorize this app by visiting this url: ', authUrl); 
    var rl = readline.createInterface({ 
    input: process.stdin, 
    output: process.stdout 
    }); 
    rl.question('Enter the code from that page here: ', function(code) { 
    rl.close(); 
    oauth2Client.getToken(code, function(err, token) { 
     if (err) { 
     console.log('Error while trying to retrieve access token', err); 
     return; 
     } 
     oauth2Client.credentials = token; 
     storeToken(token); 
     callback(oauth2Client); 
    }); 
    }); 
} 


function listFiles(auth, callback, event) { 
    var service = google.drive('v3'); 
    service.files.list({ 
    auth: auth, 
    pageSize: 10, 
    fields: "nextPageToken, files(id, name)" 
    }, function(err, response, listMusic) { 
    if (err) { 
     console.log('The API returned an error: ' + err); 
     return; 
    } 
    var files = response.files; 
    if (files.length == 0) { 
     console.log('No files found.'); 
    } else { 
     callback(event, files); 
    } 
    }); 
    }