2016-05-22 18 views
11

Sto imparando Firebase e Node.js. Voglio ricevere i miei tweet da Twitter e inviarli a Firebase. Non ho problemi a ricevere tweet da Twitter. La mia domanda è: come posso inviare i dati a Firebase?Come ottenere e impostare i dati su Firebase con Node.js?

ho provato il seguente codice:

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

ed ho ottenuto il seguente errore sulla console:

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

Inoltre, questo le mie regole Firebase: { "regole":. {" Leggere ": true,". write ": true}}

+0

a quanto pare, che c'è un problema con la tua chiave privata. Non puoi passare il percorso di 'privateKey.pem' come argomentazione? –

+0

checkout loro quickstart https://github.com/firebase/quickstart-nodejs/tree/master/database – garrettmac

risposta

13

Ho risolto il mio problema. Ho appena scaricato il file jas di serviceAccount da Firebase Console e l'ho inserito nel mio progetto. Il file 'Account servizio' contiene tutto ciò di cui hai bisogno.

var firebase = require('firebase'); 

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

Quindi il codice seguente ha funzionato bene.

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

proprietà "serviceAccount" è deprecato, si dovrebbe invece utilizzare la proprietà "credenziale". –

8

Abbiamo affrontato lo stesso problema con AWS Beanstalk. La causa principale era perché \n è stato sostituito da \\n nella variabile chiave privata.

Dopo aver aggiunto il regexp sostituirlo è stato fissato:

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

Stampa delle variabili nel registro potrebbe anche contribuire a isolare il problema.

+0

di fronte allo stesso problema. La tua risposta funziona come un incantesimo! – Pl4yeR

9

Questa specifica sintassi/libreria per gli account di servizio nelle app node è obsoleta. Il nuovo metodo per raggiungere Firebase su un server (ovvero, non un'app consumer, come IoT o desktop) è lo firebase admin sdk.

Il codice di inizializzazione dovrebbe ora andare:

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

È ancora possibile inserire manualmente le proprie credenziali, ma sono ora assegnati a una proprietà 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

verificato. Da https://firebase.google.com/docs/admin/setup: le versioni precedenti dell'SDK Node.js hanno accettato una proprietà serviceAccount anziché la proprietà credenziali. Allo stesso modo, le versioni precedenti di Java SDK includevano un metodo setServiceAccount() invece del metodo setCredential(). Sebbene entrambi siano ancora consentiti, generano un avviso di ritiro e verranno rimossi nella successiva versione principale degli SDK. –

Problemi correlati