2016-05-22 15 views
11

Uczę się Firebase i Node.js. Chcę otrzymywać Tweety z Twittera i wysyłać je do Firebase. Nie mam problemu z tweetem na Twitterze. Moje pytanie brzmi: jak mogę wysłać dane do Firebase?Jak uzyskać i ustawić dane w Firebase za pomocą Node.js?

Próbowałem następujący kod:

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]" 
}); 

I mam następujący błąd w konsoli:

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... 

Również ten mój Zasady Firebase: { "zasady". {”Czytać ": true,". write ": true}}

+0

wydaje się, że Wystąpił problem z Twoim kluczem prywatnym. Czy nie możesz przekazać ścieżki 'privateKey.pem' jako argumentu? –

+0

Checkout ich quickstart https://github.com/firebase/quickstart-nodejs/tree/master/database – garrettmac

Odpowiedz

13

Rozwiązałem mój problem. Właśnie pobrałem plik json serviceAccount z Firebase Console i wstawiłem go do mojego projektu. Plik "Service Account" zawiera wszystko, czego potrzebujesz.

var firebase = require('firebase'); 

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

Wtedy poniższy kod działał ładnie.

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

Właściwość "serviceAccount" jest przestarzała, powinieneś zamiast tego użyć właściwości "credential". –

8

Ten sam problem dotyczy AWS Beanstalk. Główną przyczyną było zastąpienie \n przez \\n w zmiennej klucza prywatnego.

Po dodaniu regexp zastąpić zostało to naprawione:

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

drukowanie zmiennych w dzienniku może również pomóc izolować problem.

+0

w obliczu tego samego problemu. Twoja odpowiedź działa jak urok! – Pl4yeR

9

Ta specyficzna składnia/biblioteka dla kont usług w aplikacjach node jest przestarzała. Nowa metoda dotarcia do bazy Firebase na serwerze (to znaczy nie jest to aplikacja konsumencka, jak IoT czy komputer) to firebase admin sdk.

Twój kod inicjujący powinien teraz pójść:

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" 
}); 

Nadal można ręcznie wprowadzić poświadczenia, ale są teraz przypisane do właściwości diff't:

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

Zweryfikowano. Z https://firebase.google.com/docs/admin/setup: Wcześniejsze wersje zestawu SDK Node.js przyjmowały właściwość serviceAccount zamiast właściwości credential. Podobnie wcześniejsze wersje pakietu Java SDK zawierały metodę setServiceAccount() zamiast metody setCredential(). Chociaż oba są nadal dozwolone, powodują ostrzeżenie o wycofaniu i zostaną usunięte w następnej głównej wersji pakietów SDK. –

Powiązane problemy