2017-06-27 4 views
0

In Aktualisierung:Firebase Bestimmte Felder aktualisieren? meine Feuerbasis Datenbank kontinuierlich mit diesem Code

var admin = require("firebase-admin"); 


// Fetch the service account key JSON file contents 
var serviceAccount = require("service.json"); 

// Initialize the app with a service account, granting admin privileges 

admin.initializeApp({ 
    credential: admin.credential.cert(serviceAccount), 
    databaseURL: "DATABASE_URL" 

}); 

var db = admin.database(); 
var ref = db.ref("games"); 

var fs = require('fs'); 
var filePath = 'games/2017-06-27.json'; 
var file = fs.readFileSync(filePath); 

fs.watchFile(filePath, function() { 

var request = require('request'); 

var usersRef = ref.child('2017-06-27'); 



request('http://URL/games/2017-06-27.json', function (error, response, body) { 
    if (!error && response.statusCode == 200) { 

    var asJson = JSON.parse(body) 


    usersRef.update(asJson) 

    } 
}) 

}); 

So bekomme ich eine json mit Echtzeit-Sportdaten Partituren, Spielstatus usw. (einem anderen Dienst verwendet wird). Ich verwende dann Knoten, um Änderungen an der Datei zu überprüfen, in der die Daten gespeichert sind, und schreibe in die Firebase-Datenbank. Es funktioniert gut, aber ich möchte die DB nicht ersetzen. Ich möchte nur die Felder aktualisieren, die sich ändern, da ich anderen Dienst habe, der diesem Kind in der Datenbank, die ich behalten möchte, zusätzliche Daten hinzufügt. Wie kann ich nur die Felder mit den Änderungen aktualisieren, ohne die gesamte Datenbank zu ersetzen und auf diese Weise andere zusätzliche Daten zu behalten, die nicht aus dieser Anfrage stammen?

Antwort

0

Wenn Sie update() an einem Standort anrufen, führt Firebase eine Schleife über die Daten, die Sie übergeben (in Ihrem Fall asJson) und führt für jeden Schlüssel eine ref.child(key).set(value).

Object.keys(asJson).forEach((key) => { 
    usersRef.child(key).set(asJson[key]); 
}) 

So, während es die Top-Level-Eigenschaften von asJson mit den vorhandenen Daten unter usersRef geht, ersetzt es die Daten noch unter jeder Taste.

Wenn Sie auch auf dieser Ebene zusammenführen möchten, müssen Sie den JSON von einem Baum in eine Liste von Pfaden konvertieren. Sagen Sie Ihre JSON wie folgt aussieht:

{ 
    user1: { 
    name: "Speed_John" 
    }, 
    user2: { 
    name: "Frank van Puffelen" 
    } 
} 

Sie müssen konvertieren, dies zu:

{ 
    "user1/name": "Speed_John", 
    "user2/name": "Frank van Puffelen" 
} 

var JSON = { 
 
    user1: { 
 
    name: "Speed_John" 
 
    }, 
 
    user2: { 
 
    name: "Frank van Puffelen", 
 
    id: 209103 
 
    } 
 
}; 
 

 
var updates = {}; 
 
function flatten(json, prefix) { 
 
    Object.keys(json).forEach((key) => { 
 
    var path = (prefix||"")+"/"+key; 
 
    if (typeof json[key] === "object") { 
 
     flatten(json[key], path); 
 
    } 
 
    else { 
 
     updates[path] = json[key]; 
 
    } 
 
    }); 
 
} 
 

 
flatten(JSON); 
 
console.log(updates);

Mit diesem Code, den Sie dann anrufen:

usersRef.update(updates); 
Verwandte Themen