1

Für eine AppInventor-App, die Firebase als Datenbank verwendet, möchte ich den App-Benutzern eindeutige Benutzer-IDs zuweisen. Nach der Suche nach einigen Optionen hatte ich die Idee, dass ich eine Cloud HTTP-Funktion von der App angefordert werden könnte, und die zurückkehrenden Daten wären ein UserId generiert durch einfaches Inkrementieren der letzten UserId in der Tabelle UserIds (nicht sicher, ob es eins ist , entweder).Cloud-Funktionen HTTPS-Trigger zum Generieren eindeutiger Benutzer-IDs

Das ist die Geschichte, aber ich kann den folgenden Code nicht bereitstellen (und wenn ich kann, funktioniert es nicht wie ich es erwarte). Es liest die letzten UserId korrekt, aber ich konnte nur die bisherigen Daten überschreiben.

Es wird ein unerwarteter Token-Fehler in der "." in functions.https ausgelöst.

const functions = require('firebase-functions'); 
// Import and initialize the Firebase Admin SDK. 
const admin = require('firebase-admin'); 
admin.initializeApp(functions.config().firebase); 

var LastUserId = function f() {return admin.database().ref('UserIds').limitToLast(1)} 

exports.addWelcomeMessages = functions.https.onRequest((request, response)) => { 
    var ref = admin.database().ref('UserIds'); 
    // this new, empty ref only exists locally 
    var newChildRef = ref.push(); 
    // we can get its id using key() 
    console.log('my new shiny id is '+newChildRef.key()); 
    // now it is appended at the end of data at the server 
    newChildRef.set({User : LastUserId + 1}); 
}); 

Antwort

1

Das Firebase Authentication Paket stellt eine automatisch generierte eindeutige ID für jeden authentifizierten Benutzer bereits, die Sie von firebase.auth().currentUser.uid auf Web- und ähnlichen Verfahren für andere Plattformen erhalten.

Wenn Sie noch Ihre eigene inkrementelle ID mit Cloud-Funktionen generieren möchten, werden Sie die Verwendung eines transaction und dann zurückschicken die neue ID, so etwas wie zu machen brauchen:

const functions = require('firebase-functions'); 
const admin = require('firebase-admin'); 
admin.initializeApp(functions.config().firebase); 

exports.generateUserId = functions.https.onRequest((req, res) => { 
    var ref = admin.database().ref('/lastUserId'); 
    ref.transaction(function(current) { 
     return (current || 0) + 1; 
    }, function(error, committed, snapshot) { 
     if (error || !committed || !snapshot) { 
     console.error("Transaction failed abnormally!", error || ""); 
     } else { 
     console.log("Generated ID: ", snapshot.val()); 
     } 
     res.status(200).send(snapshot.val().toString()); 
    }); 
}); 

Dies erhöht den lastUserId Wert in der Datenbank mit einer Transaktion und sendet dann diese neue ID als Antwort zurück (mit res.send()) für die Verwendung in der aufrufenden App.

+0

schreibt dies in die Datenbank als auch ich versuche, hier zu tun: 'newChildRef.set ({Benutzer: LastUserId + 1});' – Ugur

+0

Ja, die Transaktion wird an den gleichen Speicherort jeden Wert zurückschreiben zurückgegeben wird, so wird 'return (current || 0) + 1;' den aktuellen Wert um 1 erhöhen (beginnend bei 0, wenn 'lastUserId' nicht existiert) und ihn dann automatisch in der Datenbank speichern. – Grimthorr

+0

Datenbank ist ok, aber ich bekomme Fehler in den Protokollen und es gibt die geschriebenen Daten nicht zurück: 'TypeError: Kann die Eigenschaft 'val' von undefined nicht lesen at admin.database.ref.transaction.then (/ user_code/index .js: 15: 38) bei process._tickDomainCallback (internal/process/next_tick.js: 135: 7) ' irgendwelche Ideen? – Ugur

Verwandte Themen