2016-07-05 34 views
2

Ich habe versucht, diesen sehr einfachen Web-App zu speichern fahren zu erstellen, die Google AppDataFolder Laufwerk wird mit seinem Zustand zu speichern und zu lesen, in json Format. Die Dokumentation für v3 drive api enthält jedoch keine umfassenden Beispiele dafür, wie dies einfach zu erreichen ist.Verwendung von Google AppDataFolder App-Status mit Javascript Seite auf dem Client

Bisher bin ich in der Lage zu autorisieren und Last der Google Drive api, aber ich war zu erstellen die Konfiguration json Datei nicht in der Lage, wenn es nicht vorhanden ist, oder Update sein Inhalt oder lesen, wenn es existiert.

Die Anrufe Ich mache sind: gapi.client.drive.files.get die Config json abzurufen, gapi.client.drive.files.create die Config json und gapi zu erstellen. client.drive.files.update, um den Inhalt zu aktualisieren.

Ich habe versucht, das Javascript Blob Objekt zu verwenden, um meine Datei und ihren Inhalt darzustellen, aber nichts hat funktioniert.

Da ich die Config wie zum Beispiel haben {Test: true} Zeichenfolge und den Dateinamen my-app.json, wie würde ich die gapi.client.drive.files API aufrufen zu können, zu erstellen/aktualisieren/lesen diese config?

Die abrufen Teil Ich versuchte es zu tun, indem Sie zuerst eine Liste der Dateien im App-Ordner, die Konfigurationsdatei nach Name, erhalten Sie seine ID, dann erneut für diese Datei mit der ID anfordern. Aber da ich die Datei nicht erstellen konnte, bin ich mir nicht sicher, ob es funktioniert.

-Code sieht derzeit wie folgt aus (wichtig, dass dieser Code zu notieren bekommt bauen und es ist in dem Client-Browser, nicht auf dem Server ausgeführt werden):

var config = require('../config/google-drive-config'); 
 

 
var authorize = function (immediate) { 
 
    return gapi.auth.authorize({ 
 
    'client_id': config.clientId, 
 
    scope: config.scopes.join(' '), 
 
    immediate: !!immediate 
 
    }); 
 
}; 
 

 
var loadDriveAPI = function() { 
 
    return gapi.client.load(
 
    config.apiName, 
 
    config.apiVersion 
 
); 
 
}; 
 

 
var loadAppDataFileId = function() { 
 
    return gapi.client.drive.files 
 
    .list({ 
 
     spaces: 'appDataFolder' 
 
    }) 
 
    .then(function(response) { 
 
     return _(response.files) 
 
     .find({ name: config.appDataFile }) 
 
     .get('id') 
 
     .value(); 
 
    }); 
 
}; 
 

 
var loadAppData = function (fileId) { 
 
    return gapi.client.drive.files 
 
    .get({ 
 
     'fileId': fileId 
 
    }); 
 
}; 
 

 
var saveAppData = function (appData, fileId) { 
 
    var resource = { 
 
    'name': config.appDataFile, 
 
    'parents': 'appDataFolder' 
 
    }; 
 

 
    var media = { 
 
    mimeType: 'application/json', 
 
    body: new Blob([JSON.stringify(appData)], { type: 'application/json' }) 
 
    }; 
 

 
    if (fileId) { 
 
    return gapi.client.drive.files 
 
     .update({ 
 
     fileId: fileId, 
 
     media: media 
 
     }); 
 
    } 
 

 
    return gapi.client.drive.files 
 
    .create({ 
 
     resource: resource, 
 
     media: media, 
 
     fields: 'id' 
 
    }); 
 
}; 
 

 
module.exports = { 
 
    authorize: authorize, 
 
    loadDriveAPI: loadDriveAPI, 
 
    loadAppDataFileId: loadAppDataFileId, 
 
    loadAppData: loadAppData, 
 
    saveAppData: saveAppData 
 
};

+0

ich genau in dem Moment das gleiche Problem haben. Ich möchte meine Datei aktualisieren, ich habe die FileId. und habe einige JSON-Daten, die ich speichern möchte. –

+0

Willkommen bei stackoverflow. siehe [Wie schreibe ich eine gute Stackoverflow-Frage] (http: // stackoverflow.com/help/how-to-ask) um Ihre Frage zu verbessern, zeigen Sie uns den create Code, der nicht funktioniert. –

+0

Ja, mir ist klar, dass die Frage nicht richtig formuliert wurde. Ich werde mit meinem Code aktualisieren. Danke für das Feedback @ZigMandel –

Antwort

4

Nach einer Menge von Versuch und Fehler, ich habe es endlich funktioniert. Ich konnte nicht gapi.client.drive.files.update zu arbeiten, aber es funktioniert mit gapi.client.request:

var auth = function (immediate) { 
 
    return gapi.auth.authorize({ 
 
    'client_id': 'YOUR CLIENT ID GOES HERE', 
 
    // Permissions here can be more restrictive 
 
    scope: 'https://www.googleapis.com/auth/drive', 
 
    immediate: immediate 
 
    }); 
 
}; 
 

 
var silentAuth = function() { 
 
    return auth(true); 
 
}; 
 

 
var popupAuth = function() { 
 
    return auth(false); 
 
}; 
 

 
var loadDriveAPI = function() { 
 
    return global.gapi.client.load('drive', 'v3'); 
 
}; 
 

 
var getAppDataFile = function() { 
 
    return gapi.client.drive.files 
 
    .list({ 
 
     q: 'name="your-app-data-file-name.json"', 
 
     spaces: 'appDataFolder', 
 
     fields: 'files(id)' 
 
    }).then(
 
     function (data) { 
 
     if (_.isEmpty(data.result.files)) { 
 
      throw "no files found"; 
 
     } 
 

 
     return { 
 
      fileId: data.result.files[0].id 
 
     } 
 
     } 
 
    ); 
 
}; 
 

 
var createAppDataFile = function() { 
 
    return gapi.client.drive.files 
 
    .create({ 
 
     resource: { 
 
     name: 'your-app-data-file-name.json', 
 
     parents: ['appDataFolder'] 
 
     }, 
 
     fields: 'id' 
 
    }).then(function (data) { 
 
     return { 
 
     fileId: data.result.id 
 
     }; 
 
    }); 
 
}; 
 

 
var getAppDataFileContent = function (fileId) { 
 
    return gapi.client.drive.files 
 
    .get({ 
 
     fileId: fileId, 
 
     // Download a file — files.get with alt=media file resource 
 
     alt: 'media' 
 
    }).then(function (data) { 
 
     return { 
 
     fileId: fileId, 
 
     appData: data.result 
 
     }; 
 
    }); 
 
}; 
 

 
var saveAppData = function (fileId, appData) { 
 
    return gapi.client.request({ 
 
    path: '/upload/drive/v3/files/' + fileId, 
 
    method: 'PATCH', 
 
    params: { 
 
     uploadType: 'media' 
 
    }, 
 
    body: JSON.stringify(appData) 
 
    }); 
 
}; 
 

 
module.exports = { 
 
    silentAuth: silentAuth, 
 
    popupAuth: popupAuth, 
 
    loadDriveAPI: loadDriveAPI, 
 
    getAppDataFile: getAppDataFile, 
 
    createAppDataFile: createAppDataFile, 
 
    getAppDataFileContent: getAppDataFileContent, 
 
    saveAppData: saveAppData 
 
};

Alle oben genannten Methoden Rückkehr ein Versprechen. Es besteht eine Abhängigkeit von lodash

+0

Ich kann meine Dankbarkeit gegenüber dieser Antwort nicht ausdrücken. funktioniert tadellos und hat viele Probleme gelöst, die die Google API-Dokumentation scheinbar stumm macht. Danke! – NoodlesFromHell