2016-05-22 12 views
11

Ich lerne Firebase und Node.js. Ich möchte meine Tweets von Twitter erhalten und sie an Firebase senden. Ich habe kein Problem, von Twitter zu twittern. Meine Frage ist, wie kann ich Daten an Firebase senden? lesen {“:Wie man Daten mit Node.js zu Firebase erhält und setzt?

Ich habe versucht, den folgenden Code:

var firebase = require('firebase'); 

// Initialize 
var app = firebase.initializeApp({ 
    ServiceAccount: { 
     projectId: "******", 
     clientEmail: "****@gmail.com", 
     privateKey: "-----BEGIN PRIVATE KEY-----\nkey\n-----END PRIVATE KEY-----\n" 
    }, 
    databaseURL: "****.firebaseio.com" 
}); 

// Set Sample Data 
firebase.database().ref('/').set({ 
    username: "test", 
    email: "[email protected]" 
}); 

Und ich bekam die folgende Fehlermeldung auf der Konsole:

Debugger listening on port 5858 
crypto.js:279 
    var ret = this._handle.sign(toBuf(key), null, passphrase); 
         ^

Error: error:0906D064:PEM routines:PEM_read_bio:bad base64 decode 
    at Error (native) 
    at Sign.sign (crypto.js:279:26) 
    at Object.sign (C:\Users\admin\Desktop\myProject\myProject\node_modules\firebase\node_modules\jsonwebtoken\node_modules\jws\node_modules\jwa\index.js:54:45) 
    at Object.jwsSign [as sign] (C:\Users\admin\Desktop\myProject\myProject\node_modules\firebase\node_modules\jsonwebtoken\node_modules\jws\lib\sign-stream.js:23:24) 
    at Object.JWT.sign (C:\Users\admin\Desktop\myProject\myProject\node_modules\firebase\node_modules\jsonwebtoken\index.js:137:16) 
    at authJwt (C:\Users\admin\Desktop\myProject\myProject\node_modules\firebase\auth-node\auth.js:83:16) 
    at fetchAccessToken (C:\Users\admin\Desktop\myProject\myProject\node_modules\firebase\auth-node\auth.js:96:17) 
    at app_.INTERNAL.getToken (C:\Users\admin\Desktop\myProject\myProject\node_modules\firebase\auth-node\auth.js:196:14) 
    at Zb.getToken (C:\Users\admin\Desktop\myProject\myProject\node_modules\firebase\database-node.js:28:3496) 
    at yh (C:\Users\admin\Desktop\myProject\myProject\node_modules\firebase\database-node.js:195:334) 
Press any key to continue... 

Auch dies ist mein Feuerbasis Regeln: { "Regeln". "write": true}}

+0

es scheint, dass Es gibt ein Problem mit Ihrem privaten Schlüssel. Kannst du nicht den Weg von 'privatKey.pem' als Argument gehen? –

+0

Überprüfen Sie ihren Quickstart https://github.com/firebase/quickstart-nodejs/tree/master/database – garrettmac

Antwort

13

Ich löste mein Problem. Ich habe gerade die Datei serviceAccount json von Firebase Console heruntergeladen und sie in mein Projekt eingefügt. Die Datei "Dienstkonto" enthält alles, was Sie benötigen.

var firebase = require('firebase'); 

firebase.initializeApp({ 
    databaseURL: 'https://*****.firebaseio.com', 
    serviceAccount: 'myapp-13ad200fc320.json', //this is file that I downloaded from Firebase Console 
}); 

Dann funktionierte der folgende Code gut.

firebase.database().ref('/').set({ 
    username: "test", 
    email: "[email protected]" 
}); 
+4

Die Eigenschaft "serviceAccount" ist veraltet, Sie sollten stattdessen die Eigenschaft "credential" verwenden. –

8

Wir hatten das gleiche Problem mit AWS Beanstalk. Die Ursache war, weil \n durch \\n in der privaten Schlüsselvariable ersetzt wurde.

Nach dem Ersetzen Zugabe regexp es behoben wurde:

"private_key": process.env.FIREBASE_PRIVATE_KEY.replace(/\\n/g, '\n') 

die Variablen in das Protokoll Drucken auch das Isolieren der Frage helfen könnte.

+0

mit demselben Problem konfrontiert. Ihre Antwort funktioniert wie ein Zauber! – Pl4yeR

9

Diese spezielle Syntax/Bibliothek für Dienstkonten in node apps wird nicht weiter unterstützt. Die neue Methode zum Erreichen der Firebase auf einem Server (also keine Consumer-App wie IoT oder Desktop) ist die firebase admin sdk.

Ihr Initialisierungscode soll jetzt gehen:

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

var serviceAccount = require("path/to/serviceAccountKey.json"); 

admin.initializeApp({ 
    credential: admin.credential.cert(serviceAccount), 
    databaseURL: "https://<DATABASE_NAME>.firebaseio.com" 
}); 

Sie können immer noch manuell Schlüssel in Ihren Anmeldeinformationen, aber sie sind jetzt zu einer diff't Eigenschaft zugewiesen:

admin.initializeApp({ 
    credential: admin.credential.cert({ 
    projectId: "<PROJECT_ID>", 
    clientEmail: "[email protected]<PROJECT_ID>.iam.gserviceaccount.com", 
    privateKey: "-----BEGIN PRIVATE KEY-----\n<KEY>\n-----END PRIVATE KEY-----\n" 
    }), 
    databaseURL: "https://<DATABASE_NAME>.firebaseio.com" 
}); 
+1

überprüft. Https://firebase.google.com/docs/admin/setup: Frühere Versionen des Node.js SDK akzeptierten eine serviceAccount-Eigenschaft anstelle der Anmeldeinformationseigenschaft. In ähnlicher Weise enthielten frühere Versionen des Java-SDK eine setServiceAccount() - Methode anstelle der setCredential() -Methode. Diese sind zwar weiterhin zulässig, führen jedoch zu einer Verwarnungswarnung und werden in der nächsten Hauptversion der SDKs entfernt. –

Verwandte Themen