web-dev-qa-db-ja.com

Node.jsでFirebaseにデータを取得および設定する方法は?

私はFirebaseとNode.jsを学んでいます。 Twitterからツイートを取得し、Firebaseに送信します。 Twitterからツイートを取得しても問題ありません。私の質問は、Firebaseにデータを送信するにはどうすればよいですか?

私は次のコードを試しました:

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

そして、コンソールに次のエラーが表示されました。

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

また、これは私のFirebaseのルール:{"rules":{"。read":true、 "。write":true}}

16
Lujska

問題を解決しました。 Firebase ConsoleからserviceAccount jsonファイルをダウンロードし、プロジェクトに挿入しました。 「サービスアカウント」ファイルには、必要なものがすべて含まれています。

var firebase = require('firebase');

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

次に、以下のコードがうまく機能しました。

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

nodeアプリのサービスアカウント用のこの特定の構文/ライブラリは非推奨です。サーバー(つまり、IoTやデスクトップなどの消費者向けアプリではない)上のfirebaseに到達する新しい方法は、 firebase admin sdk

初期化コードは次のようになります。

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

資格情報を手動で入力することもできますが、それらはdiff'tプロパティに割り当てられています:

admin.initializeApp({
  credential: admin.credential.cert({
    projectId: "<PROJECT_ID>",
    clientEmail: "foo@<PROJECT_ID>.iam.gserviceaccount.com",
    privateKey: "-----BEGIN PRIVATE KEY-----\n<KEY>\n-----END PRIVATE KEY-----\n"
  }),
  databaseURL: "https://<DATABASE_NAME>.firebaseio.com"
});
15
Brandon

AWS Beanstalkでも同じ問題に直面しました。根本的な原因は、秘密キー変数で\n\\nに置き換えられたためです。

置換正規表現を追加した後、修正されました。

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

変数をログに出力すると、問題を切り分けるのにも役立ちます。

10
riverfall